基于其他列的条件,使用大小写的列的不同值

时间:2012-12-11 21:24:38

标签: sql join if-statement

我有两个表有一个共同的字段(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条件。

任何建议都将不胜感激!

0 个答案:

没有答案