sql - DB2,按年份分组和求和,其中年份是列值
问题描述
我目前有一个像这样的 db2 查询:
SELECT
NUMBER ,
YEAR(newDate),
dollarAMT - CAST ( coupon * dollarAMT AS DECIMAL ( 12 , 2 ) ) AS TOTAL
FROM ORDERING A
LEFT JOIN table.clients CL ON CL . clientNUmber = A . clientNumber
WHERE
newDate >= '2019-01-01'
order by newDate asc;
这给出了这样的值:
123 2019 100.00
123 2019 200.00
123 2020 500.00
123 2020 800.00
123 2021 1000.00
我试图得到这个结果:
Number 2019 2020 2021
123 300.00 1300.00 1000.00
我如何在 DB2 中更改它,以便年份成为列名并按年份对销售额进行分组?
解决方案
您需要旋转数据,但 DB2 不支持 PIVOT ,因此您可以执行以下操作:
select
number,
sum(case when YEAR(newDate) = 2019 then (dollarAMT - CAST ( coupon * dollarAMT AS DECIMAL ( 12 , 2 ) ) ) end) as 2019,
sum(case when YEAR(newDate) = 2020 then (dollarAMT - CAST ( coupon * dollarAMT AS DECIMAL ( 12 , 2 ) ) ) end) as 2020,
sum(case when YEAR(newDate) = 2021 then (dollarAMT - CAST ( coupon * dollarAMT AS DECIMAL ( 12 , 2 ) ) ) end) as 2021,
FROM ORDERING A
LEFT JOIN table.clients CL ON CL.clientNUmber = A.clientNumber
WHERE newDate >= '2019-01-01'
group by number
order by number asc;
但是如果您可以将它们显示在 rows 而不是 columns 中,它会使查询更加简单,并且不需要为即将到来的每一年进行修改:
SELECT
NUMBER,
YEAR(newDate),
sum(dollarAMT - CAST (coupon * dollarAMT AS DECIMAL (12, 2))) AS TOTAL
FROM ORDERING A
LEFT JOIN table.clients CL ON CL.clientNUmber = A.clientNumber
WHERE newDate >= '2019-01-01'
group by NUMBER, YEAR(newDate)
order by NUMBER, YEAR(newDate) asc;
推荐阅读
- c# - C# 如何使用 Interop 从 Excel 读取和写入数据,而不使 Excel 可见?
- c - 如何使用 ESC 序列设置前景色?
- sql - 根级节点未出现结果
- c++ - 希望在文本文件中将逗号分隔的值添加到结构的成员
- r - 仅使用 R 中表 A 中的列合并表 A 和 B
- algorithm - 具有重叠的限制之间的值的值查找图
- javascript - 我想创建一个 js 文件并且必须动态加载 img 标签
- mysql - 在 MySQL 中存储数字 (0-999) 的最佳数据类型
- visual-studio - CMake 无法将库复制到 Visual Studio 2019 中的测试文件夹
- javascript - 如何重命名javascript对象函数hasOwnProperty?