DB2,按年份分组和求和,其中年份是列值
DB2, group and sum by year where the year is a column value
我目前有一个像这样的 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;
但如果您可以按行而不是按列显示它们,查询就会简单得多,并且不需要为即将到来的每一年修改它:
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;
我目前有一个像这样的 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;
但如果您可以按行而不是按列显示它们,查询就会简单得多,并且不需要为即将到来的每一年修改它:
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;