我有两张表,它们有一个共同的字段(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 # 和我的长代码列,如果它们满足健康)状况。
任何建议将不胜感激!