如何在oracle中透视数据?

时间:2018-07-20 10:32:21

标签: sql oracle oracle11g pivot pivot-table

我喜欢下面的oracle表中的数据。

ID      SEQ        PROD_ID       EXPIRE_DATE       
849123  134228     MZ321        12/03/2011 12:19:11   
849123  434128     MZ328        18/04/2012 12:09:11  
849123  424128     MZ326        16/02/2017 11:19:11  
849123  431128     MZ323        15/06/2012 12:29:11  
443121  133228     MZ321        12/03/2011 12:39:16  
443121  234128     MZ328        13/04/2012 12:40:19  
443121  424828     MZ326        19/02/2017 11:42:12  
443121  731129     MZ323        14/06/2012 12:45:19  

我想编写sql语句以获取以下格式的数据。
第一列应具有ID。

第二列的EXPIRE_DATE为PROD_ID MZ321。

第三列的EXPIRE_DATE应该为PROD_ID MZ326。

第四列应具有PROD_ID MZ321的SEQ。

第五列应具有PROD_ID MZ326的SEQ。
样本O / P

ID       MZ321_EXPDATE        MZ326_EXPDATE         MZ321_SEQ  MZ326_SEQ  
849123   12/03/2011 12:19:11  16/02/2017 11:19:11   134228     424128  
443121   12/03/2011 12:39:16  19/02/2017 11:42:12   133228     424828

2 个答案:

答案 0 :(得分:1)

我只会使用条件聚合:

select id,
       max(case when PROD_ID = 'MZ321' then expire_date end) as MZ321_EXPDATE,
       max(case when PROD_ID = 'MZ326' then expire_date end) as MZ326_EXPDATE,
       max(case when PROD_ID = 'MZ321' then seq end) as MZ321_seq,
       max(case when PROD_ID = 'MZ326' then seq end) as MZ326_seq
from t
group by id;

答案 1 :(得分:0)

首先,结果应按ID分组。

似乎没有必要将{strong> second third 列的值限制为{{ 1}}和MZ321的{​​{1}} s。由于如果您确定MZ326列的 最小 最大 值,则可以直接获得PROD_IDexpire_date列的相应值直接如下:

EXPDATE

SQL Fiddle Demo