【问题标题】:Non constant expression error in unpivot valuesunpivot 值中的非常量表达式错误
【发布时间】:2018-05-25 01:58:01
【问题描述】:

我正在使用 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:枢轴|非枢轴值不允许非常量表达式

这是我正在尝试的代码:

select *
from table1
unpivot
(
    USD
    for ID_TIMESPAN in 
    (
        jan as year || '-01',
        feb as year || '-02',
        mar as year || '-03'        
    )
);

请告诉我该怎么做?

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      您的桌子设计看起来不太理想。您不应该将月份名称作为列名。

      您想出的获得结果的方法很简单,而且看起来不错。但是,附带说明一下,如果您想避免几个月的硬编码,您也可以使用:

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

      【讨论】:

      • 关于您认为设计看起来很糟糕的评论。我只是想用简单的术语重现这个问题。实际情况并非如此。
      • 没问题,伙计,我换了台词。而现实..最好不要比这更可怕,我希望,仅此而已:-}
      猜你喜欢
      • 2015-03-04
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多