1

SQL #1 向我返回 163 个帐户(通过 HAVING 子句),因为它给了我从 2013 年开始首次购买特定包(包 102)的帐户。

现在我想在 2013 年按会计月份细分销售额,当我添加 [Unique_Fiscal_Month_Label] 作为列时,它给了我 406 个帐户,而 HAVING 子句现在基本上不起作用。请参阅下面的 SQL #2。任何想法为什么添加 Fiscal_Month 基本上然后给我所有曾经购买过该包裹类型的帐户?我在网上读到检查条件可能会有所帮助,但写下来没有运气。

SQL #1

SELECT 

sum([FactActualDetail].[CaseAndGallonVolume]) AS [CaseAndGallonVolume],
sum([FactActualDetail].[AdjGrossMarginAmount]) AS [AdjGrossMarginAmount],
left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #]

FROM [dbo].[FactActualDetail] [FactActualDetail] 

LEFT JOIN [dbo].[DimCustomer] [DimCustomer] 
    ON ([FactActualDetail].[CustomerSK] = [DimCustomer].[CustomerSK])
LEFT JOIN [Common].[DimDate] [DimDate] 
    ON ([FactActualDetail].[DeliveryDateSK] = [DimDate].[DateSK])

WHERE [EQMultiplier] > 0 AND ([SC] = 04 OR [SC] = 06 OR [SC] = 07) 
  AND (substring([SourceCustomerProductCode],8,3) = 102) 
  AND [Fiscal_Year] IN (2013, 2012)

GROUP BY left([FactActualDetail].[SourceCustomerProductCode],7)

HAVING MIN([Fiscal_Year])=2013

SQL #2

SELECT 

sum([FactActualDetail].[CaseAndGallonVolume]) AS [CaseAndGallonVolume],
sum([FactActualDetail].[AdjGrossMarginAmount]) AS [AdjGrossMarginAmount],
left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #],
[Unique_Fiscal_Month_Label] AS [Unique_Fiscal_Month_Label]

FROM [dbo].[FactActualDetail] [FactActualDetail] 

LEFT JOIN [dbo].[DimCustomer] [DimCustomer] 
    ON ([FactActualDetail].[CustomerSK] = [DimCustomer].[CustomerSK])
LEFT JOIN [Common].[DimDate] [DimDate] 
    ON ([FactActualDetail].[DeliveryDateSK] = [DimDate].[DateSK])

WHERE [EQMultiplier] > 0 AND ([SC] = 04 OR [SC] = 06 OR [SC] = 07) 
  AND (substring([SourceCustomerProductCode],8,3) = 102) 
  AND [Fiscal_Year] IN (2013, 2012)

GROUP BY 
  left([FactActualDetail].[SourceCustomerProductCode],7),
  [Unique_Fiscal_Month_Label]


HAVING MIN([Fiscal_Year])=2013
4

3 回答 3

0

我假设 Fiscal_Year 在 [Common].[DimDate] 表中

SELECT sum([FactActualDetail].[CaseAndGallonVolume]) AS [CaseAndGallonVolume],
       sum([FactActualDetail].[AdjGrossMarginAmount]) AS [AdjGrossMarginAmount],
       left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #],
       [Unique_Fiscal_Month_Label] AS [Unique_Fiscal_Month_Label]
FROM [dbo].[FactActualDetail] [FactActualDetail] 
  LEFT JOIN [dbo].[DimCustomer] [DimCustomer] 
    ON ([FactActualDetail].[CustomerSK] = [DimCustomer].[CustomerSK])
  LEFT JOIN [Common].[DimDate] [DimDate] 
    ON ([FactActualDetail].[DeliveryDateSK] = [DimDate].[DateSK])
WHERE [EQMultiplier] > 0 AND ([SC] = 04 OR [SC] = 06 OR [SC] = 07) 
  AND (substring([SourceCustomerProductCode],8,3) = 102) 
  AND [Fiscal_Year] = 2013 AND EXISTS (
                                       SELECT 1
                                       FROM [Common].[DimDate] AS [DimDate2]  
                                       WHERE [DimDate].[DateSK] = [DimDate2].[DateSK]
                                       HAVING MIN([DimDate2].Fiscal_Year) != 2012
                                       )                                         
GROUP BY 
  left([FactActualDetail].[SourceCustomerProductCode],7),
  [Unique_Fiscal_Month_Label]

简单的例子我在SQLFiddle上的意思

于 2013-03-11T17:22:52.647 回答
0

我们需要一些样本数据来真正回答这个问题。但我猜测问题在于您现在在 SQL #2 中按帐户和月份进行聚合,而 SQL #1 仅在帐户级别聚合。由于您的 HAVING 子句,您基本上是在过滤 2013 年客户的所有销售,而在此之前您只过滤 2013 年首次销售的客户。

您应该能够使用子查询来完成您的逻辑,即

SELECT [Unique_Fiscal_Month_Label] AS [Unique_Fiscal_Month_Label]
    , x.[CaseAndGallonVolume]
    , x.[AdjGrossMarginAmount]
    , x.[Acct #]
FROM (
    SELECT 
    sum([FactActualDetail].[CaseAndGallonVolume]) AS [CaseAndGallonVolume],
    sum([FactActualDetail].[AdjGrossMarginAmount]) AS [AdjGrossMarginAmount],
    left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #],
    MIN([FactActualDetail].[DeliveryDateSK]) AS [minDeliveryDateSK]
    FROM [dbo].[FactActualDetail] [FactActualDetail] 
    LEFT JOIN [dbo].[DimCustomer] [DimCustomer] 
        ON ([FactActualDetail].[CustomerSK] = [DimCustomer].[CustomerSK])
    WHERE [EQMultiplier] > 0 AND ([SC] = 04 OR [SC] = 06 OR [SC] = 07) 
      AND (substring([SourceCustomerProductCode],8,3) = 102) 
      AND [Fiscal_Year] IN (2013, 2012)
    GROUP BY left([FactActualDetail].[SourceCustomerProductCode],7)
    HAVING MIN([Fiscal_Year])=2013
) AS x
LEFT JOIN [Common].[DimDate] [DimDate] 
    ON ([x].[minDeliveryDateSK] = [DimDate].[DateSK]);

如果没有实际数据,这只是对查询的猜测,但希望它能让您了解如何进行。HTH。祝你好运。

于 2013-03-11T16:50:33.980 回答
0

您的having条款不再有效,因为每个组仅针对一个帐户的一个会计月,因此您将无法判断 2013 年组内哪些帐户在 2012 年有活动。相反,请尝试使用分析函数而不是整个时期 - 比如:

SELECT sum([CaseAndGallonVolume]) AS [CaseAndGallonVolume],
       sum([AdjGrossMarginAmount]) AS [AdjGrossMarginAmount],
       [Acct #],
       [Unique_Fiscal_Month_Label]
FROM (SELECT [FactActualDetail].[CaseAndGallonVolume],
             [FactActualDetail].[AdjGrossMarginAmount]),
             left([FactActualDetail].[SourceCustomerProductCode],7) as [Acct #],
             [Unique_Fiscal_Month_Label],
             min([Fiscal_Year]) over (prtition by left([FactActualDetail].[SourceCustomerProductCode],7)) as min_year
      FROM [dbo].[FactActualDetail] [FactActualDetail] 
      LEFT JOIN [dbo].[DimCustomer] [DimCustomer] 
             ON ([FactActualDetail].[CustomerSK] = [DimCustomer].[CustomerSK])
      LEFT JOIN [Common].[DimDate] [DimDate] 
             ON ([FactActualDetail].[DeliveryDateSK] = [DimDate].[DateSK])
      WHERE [EQMultiplier] > 0 AND ([SC] = 04 OR [SC] = 06 OR [SC] = 07) 
        AND (substring([SourceCustomerProductCode],8,3) = 102) 
        AND [Fiscal_Year] IN (2013, 2012)
     ) sq
WHERE min_year=2013
GROUP BY 
       [Acct #],
       [Unique_Fiscal_Month_Label]
于 2013-03-11T16:50:44.610 回答