我正在使用Oracle 11g。我有下表(这只是样本,实际上还有更多的记录):
CREATE TABLE table1(city varchar2(20), state varchar2(20), year varchar2(20), jan integer, feb integer, mar integer);
insert into table1 values('city1','state1','2017',1,2,3);
insert into table1 values('city9','state9','2018',11,12,13);
我想将它取消以下形状:
CITY STATE ID_TIMESPAN USD
city1 state1 2017-01 1
city1 state1 2017-02 2
city1 state1 2017-03 3
city9 state9 2018-01 11
city9 state9 2018-02 12
city9 state9 2018-03 13
当我尝试下面提到的代码时出现此错误:
ORA-56901:pivot | unpivot值
不允许使用非常量表达式
以下是我正在尝试的代码:
select *
from table1
unpivot
(
USD
for ID_TIMESPAN in
(
jan as year || '-01',
feb as year || '-02',
mar as year || '-03'
)
);
请告知我该如何处理?
答案 0 :(得分:1)
我使用内联视图解决了它。
select p2.city, p2.state, p2.year || '-' || p2.ID_months as ID_TIMESPAN, p2.USD
from
(
select * from table1
unpivot
(
USD
for ID_MONTHS in
(
jan as '01',
feb as '02',
mar as '03'
)
)
) p2;
答案 1 :(得分:0)
您的桌面设计看起来不太理想。您不应该将月份名称作为列名。
您提出的获得结果的方法很简单,看起来不错。但是,作为旁注,如果您想避免硬编码数月,您也可以使用:
SELECT city
,STATE
,to_char(to_date(year || ID_TIMESPAN,'YYYYMON'),'YYYY-MM') AS ID_TIMESPAN
,usd
FROM Table1
unpivot(USD FOR ID_TIMESPAN IN (
jan
,feb
,mar
));