这称为反透视。
测试数据:
create table sales (product, year, jan, feb, march, april, may, june, july, aug, sep, oct, nov, dec)
as
select 'Bike', 2020, 12, 42, 42, 42, 20, 20, 12, 10, 15, 3, 16, 27 from dual union all
select 'Bike', 2021, 10, 11, 15, 53, 30, 20, 10, 10, null, null, null, null from dual;
查询:
select *
from sales s
unpivot (month
for total in
(jan, feb, march, april, may, june, july, aug, sep, oct, nov, dec)
)
order by product, year;
PRODUCT YEAR TOTAL MONTH
------- ---------- ----- ----------
Bike 2020 JAN 12
Bike 2020 FEB 42
Bike 2020 DEC 27
Bike 2020 NOV 16
Bike 2020 OCT 3
Bike 2020 SEP 15
Bike 2020 AUG 10
Bike 2020 JULY 12
Bike 2020 JUNE 20
Bike 2020 MARCH 42
Bike 2020 APRIL 42
Bike 2020 MAY 20
Bike 2021 APRIL 53
Bike 2021 MARCH 15
Bike 2021 FEB 11
Bike 2021 JAN 10
Bike 2021 JULY 10
Bike 2021 JUNE 20
Bike 2021 MAY 30
Bike 2021 AUG 10
棘手的部分是按日历顺序对月份进行排序,因为它们的名称不一致('Jan'、'Feb',然后是'March'、'April')。您可以摆弄to_date 和substr,或者使用case 表达式为每个人分配一个数字。
另外,它应该如何处理具有空值的月份?