1

SQL#1は、2013年から特定のパッケージ(パッケージ102)を最初に購入したアカウントを提供するため、(HAVING句を介して)163アカウントを返します。

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

この質問に実際に答えるには、いくつかのサンプルデータが必要です。ただし、問題は、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各グループはアカウントの1会計月のみであるため、条項は機能しなくなります。したがって、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 に答える
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 に答える