1

タイトルが意味を成しているのか、それとも sql や tsql に関連しているのかはわかりません。私は比較的 sql に慣れておらず、vba のバックグラウンドを持っているため、以下は私が持っているものの半分です (私はそれを修正しましたが、BI パッケージはSQLリーダーは基本的なselect/from/where's..を作成し、joinではなくwhereを使用しているようです)。理解に役立つ場合は、それを使用してolapキューブにデータを入力します..したがって、読み取られる値が1つあり、関連するフィールドも多数必要です。

私はここから少し学ぶことができました(したがって、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_code と phase_code によって acct_detail テーブルに「結合」された prj_phase テーブルから取得されます。問題は、一部の acct_code には prj_code または Phase_code がないことです..それらはヌルです..したがって、prj_phase テーブルへのリンクがなく、mkt_segment がない可能性があります。この状況では、mkt_segment 値 (取得できない) の代わりにハードコードされた/デフォルト値を使用したいと考えています。Select ステートメントで mkt_segment に Case When を使用しようとしましたが、うまくいきませんでした。

別のクエリでこれを行うことができます (prj_phase テーブルを除外し、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

何を調べるかについてのヘルプ/提案は大歓迎です!!

4

2 に答える 2

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
于 2013-07-31T05:35:23.117 に答える
0

最初に、ステートメントを他のテーブルのユーザー内部結合キーワードに更新する必要があります。

あなたの条件では、結合列がnullであるため、行がまったく選択されないため、dbo.prj_phaseテーブルに外部結合を使用することはできません。SQL Join への MSDN LINK を参照してください。

この場合にできることは、サブクエリを作成し、それが null 値を返すようにしてから、そのデータをフェッチすることです。

于 2013-07-31T05:39:56.797 に答える