use*_*030 4 sql sql-server pivot
我正在尝试使用 SQL Pivot 对一些货运数据进行排序,但我无法弄清楚。我以这种方式对数据进行排序(一行包含从 2015 年到 每年每个月为一个家庭运送的总物品数):
表A
Year | Month | ItemFamilyCode | TotalShipped
2018 | 9 | FA01 | 5
2018 | 9 | FA04 | 4
2018 | 10 | FA01 | 2
2018 | 11 | FA02 | 1
2018 | 12 | FA03 | 3
2019 | 1 | FA04 | 7
Run Code Online (Sandbox Code Playgroud)
等等。我想达到以下结果:
ItemFamilyCode | 2018-9 | 2018-10 | 2018-11 | 2018-12 | 2019-1 | [..]
FA01 | 5 | 2 | 0 | 0 | 0 |
FA02 | 0 | 0 | 1 | 0 | 0 |
FA03 | 0 | 0 | 0 | 3 | 0 |
FA04 | 4 | 0 | 1 | 0 | 7 |
Run Code Online (Sandbox Code Playgroud)
等等...按顺序排列的家庭代码以及每年每个月的所有值,从较早的月份/年份到现在。是否可以?感谢任何能提供帮助的人。
小智 5
如果您想将其用作view:
SELECT * FROM
(
SELECT
Concat([Year],'-', [Month]) as [Date],
ItemFamilyCode,
TotalShipped
FROM Shipping -- Or any Table Name
) t
PIVOT(
Sum(TotalShipped)
FOR [Date] IN (
[2018-9],
[2018-10],
[2018-11],
[2018-12],
[2019-1],
[2019-2] -- You have to type all months until today
)
) AS pivot_table;
Run Code Online (Sandbox Code Playgroud)
并且,dynamic sql如果您可以在以下位置使用它stored procedure:
用日期列表的内容制作表格以生成日期列表字符串
DECLARE
@columns NVARCHAR(MAX) = '',
@sql NVARCHAR(MAX) = '';
-- select the category names
SELECT
@columns+=QUOTENAME(Date) + ','
FROM
DateList
ORDER BY
DateList;
-- remove the last comma
SET @columns = LEFT(@columns, LEN(@columns) - 1);
-- construct dynamic SQL
SET @sql ='
SELECT * FROM
(
SELECT
Concat([Year],'-', [Month]) as [Date],
ItemFamilyCode,
TotalShipped
FROM Shipping -- Or any Table Name
) t
PIVOT(
Sum(TotalShipped)
FOR [Date] IN ('+ @columns +')
) AS pivot_table;';
-- execute the dynamic SQL
EXECUTE sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)
来源:sqlserver教程