首页 > 解决方案 > 最近 3 年 SQL 的查询和透视列

问题描述

我的需要是从过去三年中检索销售数据并对其进行透视并对数量求和。请参见下面的示例。我想知道怎么做。我读到 SQL pivot 是要走的路,但我不知道如何处理过去N年“自动”旋转。

输入

+----------+----------+------+
| ItemCode | Quantity | Date |
+----------+----------+------+
|     A    |    100   | 2017 |
+----------+----------+------+
|     B    |    200   | 2017 |
+----------+----------+------+
|     B    |    200   | 2017 |
+----------+----------+------+
|     A    |    50    | 2018 |
+----------+----------+------+
|     A    |    170   | 2018 |
+----------+----------+------+
|     A    |    75    | 2019 |
+----------+----------+------+
|     B    |    10    | 2019 |
+----------+----------+------+

输出

+---+------+------+------+
|   | 2017 | 2018 | 2019 |
+---+------+------+------+
| A |  100 |  220 |  75  |
+---+------+------+------+
| B |  400 |   -  |  10  |
+---+------+------+------+

标签: sqlsql-serveropensql

解决方案


基于 Venkataraman R 的答案。如果您希望添加年份,您可以使用一些动态代码:

DROP TABLE IF EXISTS #Temp
CREATE TABLE #temp
    ( ItemCode char(1)
    , Quantity int
    , [Date] int
    )
INSERT INTO #temp
VALUES    ('A',100,2017)
        , ('B',200,2017)
        , ('B',200,2017)
        , ('A',50,2018)
        , ('A',170,2018)
        , ('A',75,2019)
        , ('B',10,2019);

DECLARE 
    @columns nvarchar(MAX) = ''
    , @sql nvarchar(MAX);

SELECT 
    @columns += QUOTENAME([Date]) + ','
FROM (
    SELECT [Date]
    FROM #temp
    GROUP BY [Date]) AS t
ORDER BY 
    [Date];

SET @columns = LEFT(@columns, LEN(@columns) - 1);

PRINT @columns;

SET @sql = '
SELECT 
    *
FROM #temp AS t
PIVOT(
    SUM(Quantity)
    FOR [Date] IN(
    ' + @columns + '
        )) AS pvt'

EXECUTE sp_executesql @sql

推荐阅读