1

我有两张表,它们有一个共同的字段(acct #)。表 1 具有不同的帐户 # 值,表 2 具有帐户 # 在 2 年期间每天销售的数量。我实际上是在尝试从 table2 到 table1 进行 sumif 查找,如果 Volume 在 table2 中包含的某个日期 [DeliveryDateSk] 内,则对 Volume 求和。

现在我可以为 table1 和 table2 使用同一个表。我对 table1 的 sql 将是:

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

表 2 已被分解,我已按天对所有产品进行分组,删除了表的 [EQMultiplier] 列中包含 0 的任何产品线,仅显示 [DeliveryDateSk] > 20110102。我还加入了另一个表 (DimCustomer) 仅向我显示 [SC] = 4 或 5 或 6 或 7 的客户。我需要执行此 sql 以减少行数,并按账户按天显示 Volume by day。

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 #'s 列表。对于 table1,如果 [DeliveryDateSk] 在今年的第 1 周,我将需要为将返回 Volume 的列编写代码。然后,我将编写语句以在我编写的第一个代码的前 52 周内返回 [DeliveryDateSk] 的 Volume。语句将如下所示:

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]

如果帐户是新帐户,那应该返回 1。然后我将重复代码并在第 2 周执行 ELSEIF,依此类推,直到 52。我的输出将只有两列:Acct # 和我的长代码列,如果它们满足健康)状况。

任何建议将不胜感激!

4

0 回答 0