2013-07-31 1 views
1

Я понятия не имею, имеет ли смысл смысл заголовка, или если это относится к sql или tsql, поскольку я относительно новичок в sql и пришел из фон vba, но ниже - половина из того, что у меня есть (я внёс в это исправление, но в SQL-пакете BI-пакета был создан базовый select/from/where .. и он, по-видимому, использует, а не как join). Если это помогает в понимании, я использую его для заполнения куба olap. Также есть 1 значение, которое читается, и требуется также много связанного поля.Как «hardcode» значение поля select, когда нет соединения с другой таблицей

Мне удалось немного узнать отсюда (следовательно, почему я думаю, что это может быть tsql), но я застрял в этом.

Я получаю значение * dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc * и это связано с месяц (форма accouting_period), org_code, acc_code и mkt_segment

Mkt_segment приходит из таблицы prj_phase, который «соединен» с таблицей acct_detail с помощью prj_code и phase_code. Проблема в том, что для некоторых acct_code нет prj_code или Phase_code..they являются нулевыми..так также не может быть никакой ссылки на таблицу prj_phase и поэтому нет mkt_segment. В этой ситуации я хочу использовать значение hardcoded/default вместо значения mkt_segment (которое не может быть получено). Я попытался использовать случай, когда для mkt_segment в инструкции select, но это не сработало.

Я могу сделать это в отдельном запросе (исключая таблицу prj_phase и hardcoding значение в инструкции select и помещая где dbo.acct_code.phase_code имеет значение null) .. но мне интересно, как я могу это сделать это в одном запросе.

SELECT 
    CASE WHEN substring(cast(dbo.gl_acct_detail.accounting_period as CHAR), 5, 2) < '07' 
      THEN Left(dbo.gl_acct_detail.accounting_period, 6) - 94 
      ELSE Left(dbo.gl_acct_detail.accounting_period, 6) - 6 
    end, 
    dbo.gl_acct_detail.org_code, 
    dbo.gl_acct_detail.acct_code, 
    dbo.prj_phase.mkt_segment, 
    CASE WHEN (dbo.gl_acct_detail.fiscal_per_nbr <> '12' and dbo.gl_acct_detail.acct_code = '70199') 
      THEN '0' 
      ELSE dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc 
    end 
FROM 
    dbo.gl_acct_detail, dbo.sys_defaults, dbo.prj_phase 
WHERE 
    dbo.gl_acct_detail.fiscal_year = dbo.sys_defaults.current_fiscal_year -1 
    AND dbo.gl_acct_detail.phase_code = dbo.prj_phase.phase_code 
    AND dbo.gl_acct_detail.prj_code = dbo.prj_phase.prj_code 

Любая помощь/предложения относительно того, что посмотреть, будут очень признательны!

+3

[Плохие привычки пинать: использование старинного стиля JOINs] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - стиль старого стиля * разделенный запятыми список таблиц * был отменен с помощью ANSI - ** 92 ** SQL Standard (более ** 20 лет ** назад) –

+0

Попробуйте внешнее соединение, оно будет использовать значение «null» в качестве значения по умолчанию. – ewernli

+0

Интересно знать Марк, но, как я уже говорил, базовый код генерируется пакетом BI посредством перетаскивания таблиц/полей/объединений ... так что это не привычка – Brendanjb

ответ

1

Попробуйте это:

SELECT 
    CASE WHEN substring(cast(dbo.gl_acct_detail.accounting_period as CHAR), 5, 2) < '07' 
      THEN Left(dbo.gl_acct_detail.accounting_period, 6) - 94 
      ELSE Left(dbo.gl_acct_detail.accounting_period, 6) - 6 
    end, 
    dbo.gl_acct_detail.org_code, 

    dbo.gl_acct_detail.acct_code 
    , 
    case 
    when (dbo.gl_acct_detail.phase_code is null or dbo.gl_acct_detail.prj_code is null) 
        then 'default value' 
     else dbo.prj_phase.mkt_segment 
     end mkt_segment, 
    CASE WHEN (dbo.gl_acct_detail.fiscal_per_nbr <> '12' and dbo.gl_acct_detail.acct_code = '70199') 
      THEN '0' 
      ELSE dbo.gl_acct_detail.db_amt_cc - dbo.gl_acct_detail.cr_amt_cc 
    end 
FROM 
    dbo.gl_acct_detail 
    left join 
    dbo.sys_defaults on dbo.gl_acct_detail.fiscal_year = dbo.sys_defaults.current_fiscal_year -1 

    left join 
    dbo.prj_phase on dbo.gl_acct_detail.phase_code = dbo.prj_phase.phase_code 
        AND dbo.gl_acct_detail.prj_code = dbo.prj_phase.prj_code 
+0

он хочет использовать любое ключевое слово для соединения ~ –

+0

@ user2636610: Помогает ли это? –

+0

Большое спасибо Рави, что привело меня туда, а не только для того, чтобы понять, почему и как! – Brendanjb

0

Вам сначала нужно обновить вас заявления пользователя INNER JOIN ключевые слова для других таблиц.

Для вашего условия вы не можете использовать Outer Присоединиться к таблице dbo.prj_phase, поскольку столбцы объединения равны нулю, и эта строка вообще не будет получена. См. MSDN LINK to Sql Join

В этом случае вы можете сделать Sub Query и вернуть это значение null, а затем извлечь эти данные.

Смежные вопросы