我试图创建一个按月和年汇总数据的查询,偶然发现了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,我认为它可以很容易地完成。
答案 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