非透明值中的非常量表达式错误

时间:2018-05-24 16:31:43

标签: sql oracle oracle11g

我正在使用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'        
    )
);

请告知我该如何处理?

2 个答案:

答案 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
            ));