使用' Pivot'将日期行转换为汇总列。在SQL Server中

时间:2016-03-17 20:51:53

标签: sql-server pivot pivot-table

我试图创建一个按月和年汇总数据的查询,偶然发现了PIVOT并且一直在尝试(我有SQL Server 2012)。我的数据看起来像这样:

Supplier  Date       Sales
          (mm-yyyy) 
--------  -------   ------
A         01-2012   157.54
A         02-2012   215.43
A         03-2012   993.88
B         04-2014    85.50
B         04-2014    41.50
C         01-2012   112.22
C         05-2015    84.55
C         06-2015  1188.42
C         07-2015   445.58

基本上有数百家供应商有日期和销售额。我想按月和年创建这些数据的摘要,格式如下:

Supplier    Month   2012    2013    2014    2015     
--------    -----   ----    ----    ----    ----
A           01      100.51  155.96  15.10   699.66   
A           02      54.89   155.55      0   144.52 
A           03      11.53   488.99  419.98  155.21   
A           04
A           05
A           06
A           07      
A           08
A           09
A           10
A           11
A           12
B           01
B           02  

每个供应商将有12行,每月一个,然后按行汇总年份。

这可以用PIVOT完成还是有更好的方法?我可以用另一种更痛苦的方式做到这一点,但基于在这里看到一些PIVOT问题,比如这个:Convert Rows to columns using 'Pivot' in SQL Server,我认为它可以很容易地完成。

1 个答案:

答案 0 :(得分:1)

;WITH cte AS (
SELECT * FROM (VALUES
('A', '01-2012', 157.54),
('A', '02-2012', 215.43),
('A', '03-2012', 993.88),
('B', '04-2014', 85.50),
('B', '04-2014', 41.50),
('C', '01-2012', 112.22),
('C', '05-2015', 84.55),
('C', '06-2015', 1188.42),
('C', '07-2015', 445.58)) as t(Supplier, [Date], Sales)
)

SELECT Supplier,[Month],[2012],[2013],[2014],[2015]
FROM
(
SELECT Supplier,
       LEFT([Date],2) as [Month],
       CASE WHEN RIGHT([Date],4) = 2012 THEN '2012' 
            WHEN RIGHT([Date],4) = 2013 THEN '2013' 
            WHEN RIGHT([Date],4) = 2014 THEN '2014' 
            WHEN RIGHT([Date],4) = 2015 THEN '2015' 
            ELSE NULL
            END as [Year],
       Sales
FROM cte
) d
pivot
(
SUM(Sales) for [Year] in ([2012],[2013],[2014],[2015])
) piv
ORDER BY Supplier, [Month];

结果:

Supplier    Month   2012    2013    2014    2015
A           01      157.54  NULL    NULL    NULL
A           02      215.43  NULL    NULL    NULL
A           03      993.88  NULL    NULL    NULL
B           04      NULL    NULL    127.00  NULL
C           01      112.22  NULL    NULL    NULL
C           05      NULL    NULL    NULL    84.55
C           06      NULL    NULL    NULL    1188.42
C           07      NULL    NULL    NULL    445.58