我有两个表有一个共同的字段(acct#)。表1具有acct#的不同值,而table2具有按acct#在2年内按天销售的数量。我本质上是尝试从table2到table1进行sumif查找,如果Volume在特定日期[DeliveryDateSk]内,则汇总Volume,它包含在table2中。
现在我可以对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 |
我现在要做的是将table2与table1连接,其中包含一个不同的Acct#列表。使用table1,我需要编写一个代码,如果[DeliveryDateSk]在今年的第1周,我将返回Volume。然后,我将写一些语句,以便为我编写的第一个代码的前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周(20120109和20120115之间的[DeliveryDateSK]之间有交易量,并且在之前的52周内没有交易量(2011年第2周至2012年第1周,或更确切地说 - 20110110和20120108) ),然后我会注意到它是“2”。所以你可以想象一个长代码!
我正在描绘一条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是新的acct,那应该给我一个1。然后我会重复代码并为第2周做ELSEIF,依此类推,直到52.我的输出只有两列:Acct#和我的长代码列,如果满足了它,它的值将从1到52条件。
任何建议都将不胜感激!