sql - 最近 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 |
+---+------+------+------+
解决方案
基于 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
推荐阅读
- python - Odoo 模型继承问题
- python - 如何将 Celery 与 redis 连接起来?
- php - MYSQLI SQL 错误/在一台服务器上运行但不在其他服务器上
- laravel - 过滤页面结果 Laravel many to many, many ids to find one entry
- linux - gitlab代码部署Azure Function-如何控制版本号
- d3.js - d3.js - 树节点距离同样边界到边界
- python - 将列表中的 None/null 值与矢量化字符串进行比较时发生异常错误
- angular - Angular 12 http 请求:无效的 URL
- docker - 从 Docker 容器中在 Synology 上运行 PHP 脚本
- python - 需要使用 > 或 < 来比较 pandas 中的数据框列