2017-02-06 19 views
2

私は何千もの企業を掲載していますが、私は2社を引用しました。私は、値が企業ごとの売上高の合計であり、対応する実際の年の前年の年である&四半期の列を生成する必要があります。日付ごとの集計

Company   Sales Quarter Year  TotalSales QtrYr_Included 
ABC Inc.  10,000  1  2010   null  Q12009 - Q42009 
ABC Inc.  50,000  2  2010  10,000  Q22009 - Q12010 
ABC Inc.  35,000  3  2010  60,000  Q32009 - Q22010 
ABC Inc.  15,000  4  2010  95,000  Q42009 - Q32010 
ABC Inc.   5,000  1  2011  110,000  Q12010 - Q42010 
ABC Inc.  10,000  2  2011  105,000  Q22010 - Q12011 
SoKor Group  50,000  1  2009   null  Q12008 - Q42008 
SoKor Group  10,000  2  2009  50,000  Q22008 - Q12009 
SoKor Group  10,000  3  2009  60,000  Q32008 - Q22009 
SoKor Group  5,000  4  2009  70,000  Q42008 - Q32009 
SoKor Group  15,000  1  2010   .   Q12009 - Q42009 
SoKor Group  20,000  3  2010   .   Q22009 - Q12010 

ありがとうございました。ここで

+0

テーブル*常に*会社のすべての四半期のデータを持っているのだろうか? –

+0

so..その場合、不足している四半期のデータを0として扱い、合計を報告するか、別の年の四半期を指定された順序で考慮する必要がありますか? –

+0

@ mnms2 - 使用しているSQL Serverのバージョンは? –

答えて

3

はPRDPのソリューション@古いバージョン

;WITH cte 
    AS (SELECT Row_number()OVER(partition BY Company ORDER BY [Year], [Quarter]) rn,* 
     FROM Yourtable a) 
SELECT * 
FROM cte a 
     CROSS apply (SELECT Sum (sales) Total_sales 
        FROM (SELECT TOP 4 sales 
          FROM cte b 
          WHERE a.Company = b.Company 
            AND b.rn < a.rn 
          ORDER BY [Year] DESC, 
             [Quarter] DESC)a) cs 
+0

Prdp ..これは四半期のいずれにも欠けているデータがないことを前提としています。欠落しているデータがある場合に何が起こるかを示し、代替のアプローチについても説明する必要があります。 –

+0

@vkp - 有効なポイント..更新されます.. –

0

ためSum Overウィンドウ集計

SELECT *, 
     Sum(sales) 
     OVER(
      partition BY Company 
      ORDER BY [Year], [Quarter] ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING) 
FROM Yourtable 

を使用してそれを行うための一つの方法が有効です。ただし、欠落している行の前に利用可能な行があるかどうかを検討するため、特定の会社に四半期が欠落していると誤った結果が表示されます。このような状況を回避する方法は、派生テーブルを使用して年、四半期、および企業のすべての組み合わせを生成することです。元のテーブルをこのままにしておくと、不足している四半期の売上は0になります。次に、sumウィンドウ関数を使用して、各行の最後の4つの四半期の売上の合計を取得します。

SELECT * 
FROM 
(SELECT C.COMPANY, 
     Y.[YEAR], 
     Q.[QUARTER], 
     T.SALES, 
     SUM(COALESCE(T.SALES,0)) OVER(PARTITION BY C.COMPANY 
             ORDER BY Y.[YEAR], Q.[QUARTER] 
             ROWS BETWEEN 4 PRECEDING AND 1 PRECEDING) AS PREV_4QTRS_TOTAL 
    FROM 
    (SELECT 2008 AS [YEAR] 
    UNION ALL SELECT 2009 
    UNION ALL SELECT 2010 
    UNION ALL SELECT 2011 
    UNION ALL SELECT 2012 
    UNION ALL SELECT 2013) Y --Add more years as required or generate them using a recursive cte or a tally table 
    CROSS JOIN 
    (SELECT 1 AS [QUARTER] 
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4) Q 
    CROSS JOIN 
    (SELECT DISTINCT COMPANY 
    FROM T) C 
    LEFT JOIN T ON Y.[YEAR]=T.[YEAR] 
    AND Q.[QUARTER]=T.[QUARTER] 
    AND C.COMPANY=T.COMPANY 
) X 
WHERE SALES IS NOT NULL --to filter the result to include only rows from the original table 
ORDER BY 1,2,3 

Sample Demo