【问题标题】:Oracle - Transpose Row into ColumnOracle - 将行转置为列
【发布时间】:2018-10-20 05:46:00
【问题描述】:

我想将以下行结果转换为列。我正在考虑 PIVOT,但我不相信我能达到预期的结果。

原样:

ID_NCM | DESTINATION | START      | END  
36393  | PE          | 01-01-2018 | 10-31-2018
36393  | PE          | 11-01-2018 | 12-31-9999

成为:

ID_NCM | DESTINATION | CURRENT_START | CURRENT_END | FUTURE_START | FUTURE_END
36393  | PE          | 01-01-2018    | 10-31-2018  | 11-01-2018   | 12-31-9999

我是否在这里遗漏了一些表结构概念,从而无法使用 select 语句实现所需的布局?

谢谢。

【问题讨论】:

    标签: sql oracle oracle12c transpose


    【解决方案1】:

    你可以试试这样的 -

    select id_ncm,
           destination,
           max(decode(myrank, 1, start_date)) current_start,
           max(decode(myrank, 1, end_date)) current_end,
           max(decode(myrank, 2, start_date)) future_start,
           max(decode(myrank, 2, end_date)) future_end
      from (select id_ncm,
                   destination,
                   start_date,
                   end_date,
                   rank() over(partition by id_ncm order by start_date, end_date) myrank
              from your_table) v1
     group by id_ncm, destination
    

    【讨论】:

    • 我会试一试...谢谢
    【解决方案2】:

    您可以直接将grouping by ID_NCM,DESTINATIONminmax 函数作为:

    with t(ID_NCM,DESTINATION,"START","END") as
    (  
     select 36393,'PE',date'2018-01-01',date'2018-10-31' from dual union all
     select 36393,'PE',date'2018-01-11',date'9999-12-31' from dual 
    )
    select ID_NCM,DESTINATION,
           min("START") as CURRENT_START,min("END") as CURRENT_END,
           max("START") as FUTURE_START,max("END") as FUTURE_END
      from t
     group by ID_NCM,DESTINATION
    
    ID_NCM  DESTINATION CURRENT_START  CURRENT_END   FUTURE_START  FUTURE_END
    ------  ----------- -------------  ------------  ------------  -----------
    36393       PE       01.01.2018     31.10.2018    11.01.2018   31.12.9999
    

    附注STARTENDOracle 中的保留关键字,所以用双引号括起来。

    编辑:由于您的最后评论,您可以通过添加相关子查询来进行更改,如下所示:

    with t(ID_NCM,DESTINATION,"START","END",tax_rate) as
    (  
     select 36393,'PE',date'2018-01-01',date'2018-10-31',0.06 from dual union all
     select 36393,'PE',date'2018-01-11',date'9999-12-31',0.04 from dual 
    )
    select ID_NCM,DESTINATION,
           min("START") as CURRENT_START,min("END") as CURRENT_END,
           max("START") as FUTURE_START,max("END") as FUTURE_END,
           (select tax_rate from t where "START"=date'2018-01-01' and "END"=date'2018-10-31') 
                                                                             as current_rate,
           (select tax_rate from t where "START"=date'2018-01-11' and "END"=date'9999-12-31') 
                                                                             as future_rate
      from t
     group by ID_NCM,DESTINATION
    
    ID_NCM  DEST   CURRENT_START  CURRENT_END  FUTURE_START  FUTURE_END CURRENT_RATE FUTURE_RATE
    ------  ----- -------------  ------------  ------------  ----------- ----------- -----------
    36393   PE     01.01.2018     31.10.2018    11.01.2018   31.12.9999     0,06          0,04
    

    Edited Rextester Demo

    【讨论】:

    • 虽然我采用了第一个示例作为解决方案,但我意识到您的示例要简单得多,而且在我的情况下,行数会大大减少。但是有一个问题。 如果我在开始列和结束列添加另一列代表税率(第一行 6%,第二行 4%)。 MAX / MIN 函数没有多大意义。我们怎样才能克服这一点?谢谢
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多