带有月份和年份的 SQL 数据透视

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教程