oracle—将sql行数据转换为列数据

tyg4sfes  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(425)

在sql中,我们需要按以下方式转换表:
表1:

+-----+---------+-----------+
| ID  | insured |    DOD    |
+-----+---------+-----------+
| 123 | Pam     | 6/18/2013 |
| 123 | Nam     | 2/12/2010 |
| 123 | Tam     | 2/10/2013 |
| 456 | Jessi   | 4/6/2003  |
| 457 | Ron     | 4/10/2010 |
| 457 | Tom     | 5/5/2008  |
+-----+---------+-----------+

所需输出表:

+-----+---------+-----------+-----------+-----------+
| ID  | insured |   DOD1    |   DOD2    |   DOD3    |
+-----+---------+-----------+-----------+-----------+
| 123 | Pam     | 6/18/2013 | 2/12/2010 | 2/10/2013 |
| 456 | Jessi   | 4/6/2003  | null      | null      |
| 457 | Ron     | 4/10/2010 | 5/5/2008  | null      |
+-----+---------+-----------+-----------+-----------+

我在某个地方见过我们可以使用pivot和unpivot,但我不知道在这里如何使用它。
非常感谢你的帮助。

waxmsbnn

waxmsbnn1#

我会这样运行它,猜测你的id是一个数字,你只想要那些记录。从垂直到水平,轴是最好的选择

select id , insured, DOD  from yourtable  
 pivot(max(DOD) for ID in (123,456,457));
rqcrx0a6

rqcrx0a62#

假设您真的想要——或者可以接受——按降序排列的日期,那么您可以使用条件聚合:

select id,
       max(case when seqnum = 1 then insured end) as insured,
       max(case when seqnum = 1 then dod end) as dod_1,
       max(case when seqnum = 2 then dod end) as dod_2,
       max(case when seqnum = 3 then dod end) as dod_3
from (select t.*,
             row_number() over (partition by id order by dod desc) as seqnum
      from t
     ) t
group by id;

如果您想保留原始顺序,那么您的问题没有足够的信息。如果有一列具有排序,则可以用于 row_number() .

相关问题