【问题标题】:SQL Pivot with Month and Year带有月份和年份的 SQL Pivot
【发布时间】:2020-01-14 00:00:23
【问题描述】:

我正在尝试使用 SQL Pivot 对一些货运数据进行排序,但我无法弄清楚。 我以这种方式对数据进行了排序(一行是从 2015 年到 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

等等。我想达到以下结果:

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   |

依此类推...家庭代码按顺序排列,以及每年每个月的所有值,从较早的月份/年份到现在。可能吗?感谢任何可以提供帮助的人。

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    如果你想把它用作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;
    

    还有,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;
    

    来源:sqlservertutorial

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      • 2021-12-31
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多