1

共通のフィールド (acct #) を持つ 2 つのテーブルがあります。テーブル 1 にはアカウント # の個別の値があり、テーブル 2 には 2 年間にわたって日ごとにアカウント # ごとに販売されたボリュームがあります。私は基本的に、table2 から table1 への sumif ルックアップを実行し、ボリュームが table2 に含まれる特定の日付 [DeliveryDateSk] 内にある場合、ボリュームを合計しようとしています。

これで、table1 と table2 の両方に同じテーブルを使用できます。table1 の私の sql は次のようになります。

SELECT
left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #]
FROM [dbo].[FactActualDetail] [FactActualDetail]
GROUP BY left([FactActualDetail].[SourceCustomerProductCode],7)

Table2 は既に分割されており、すべての製品を日ごとにグループ化し、テーブルの [EQMultiplier] 列に 0 を含む製品ラインを除外し、[DeliveryDateSk] > 20110102 のみを表示しています。テーブル (DimCustomer) を使用して、[SC] = 4 または 5 または 6 または 7 の顧客のみを表示します。この sql を実行して、行数を減らし、Acct ごとに日ごとのボリュームを表示するだけです。

SELECT 
sum([FactActualDetail].[Volume]) AS [Volume],
sum([FactActualDetail].[GrossMargin]) AS [GrossMargin],
left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #],
[FactActualDetail].[DeliveryDateSK] AS [DeliveryDateSK]

FROM [dbo].[FactActualDetail] [FactActualDetail]
LEFT JOIN [dbo].[DimCustomer] [DimCustomer] ON ([FactActualDetail].[CustomerSK]
= [DimCustomer].[CustomerSK])

WHERE [EQMultiplier] > 0 AND [DeliveryDateSK] > 20110102 AND ([SC] = 04 OR [SC]
= 05 OR [SC] = 06 OR [SC] = 07)

GROUP BY left([FactActualDetail].[SourceCustomerProductCode],7),[DeliveryDateSK]

したがって、上記のコードの結果は、次のような Table2 を返します。

| Volume | GrossMargin  | Acct #  |  DeliveryDateSk | 
---------------------------------------------------------------
|    5   |      35      | 5551111 |     20110101    |  
|    3   |      15      | 5551111 |     20110105    |  
|    6   |      40      | 5551112 |     20110101    |  
|    2   |      11      | 5551112 |     20110109    |  
|    1   |       9      | 5551112 |     20110110    |  
|    9   |      77      | 5551113 |     20110102    |  
|    8   |      74      | 5551114 |     20110104    |     

ここでやりたいことは、テーブル 2 を、Acct # の個別のリストを含むテーブル 1 と結合することです。table1 では、[DeliveryDateSk] が今年の第 1 週の場合にボリュームを返す列のコードを記述する必要があります。次に、私が書いた最初のコードの過去 52 週間の [DeliveryDateSk] のボリュームを返すステートメントを書きます。ステートメントは次のようになります。

sum(CASE WHEN ([DeliveryDateSK] >= 20120102 AND [DeliveryDateSk] <= 20120108)
AND [FactActualDetail].[CaseAndGallonVolume] > 0 THEN 1 ELSE 0 end) AS 
[Week1 2012]

sum(CASE WHEN ([DeliveryDateSK] >= 20110103 AND [DeliveryDateSk] <= 20120101) 
AND [FactActualDetail].[CaseAndGallonVolume] > 0 THEN 1 ELSE 0 end) AS [2011]

アカウントに今年の第 1 週にボリュームがあり、それ以前の 52 週間にボリュームがなかった場合、それは新しいアカウントであり、そのように注意する必要があります (その列の単純な「1」で十分です)。週 1)。その後、次の 51 週間、上記のステートメントを繰り返す必要があります。したがって、2012 年の第 2 週 ([DeliveryDateSK] の 20120109 から 20120115 の間) にアカウントにボリュームがあり、それ以前の 52 週間 (2011 の第 2 週から 2012 の第 1 週、またはより正確には - 20110110 と 20120108) にボリュームがなかった場合)、それなら「2」と書きます。つまり、1 つの長いコードを想像できます。

次の行に沿ってSQLステートメントを描いています。

sum(CASE WHEN ((([DeliveryDateSK] >= 20120102 AND [DeliveryDateSk] <= 20120108) AND
[FactActualDetail].[Volume] > 0) AND (([DeliveryDateSK] >= 20110103 AND     
[DeliveryDateSk] <= 20120101) AND [FactActualDetail].[Volume] < 1)) THEN 1 ELSE 0 end)
AS [Week 1 NEW]

Acct が New acct の場合、1 が返されます。次に、コードを繰り返し、第 2 週の ELSEIF を実行し、52 まで同様に実行します。私の出力には、Acct # と長いコードの私の列の 2 つの列しかありません。調子。

どんな提案でも大歓迎です!

4

0 に答える 0