共通のフィールド (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 つの列しかありません。調子。
どんな提案でも大歓迎です!