首页 > 解决方案 > 如何在 Oracle 上透视此表?

问题描述

你能帮我弄清楚如何旋转这个表:

╔═══════════╦═════════════╦══════╦════════╦════════╗
║ Big Group ║ Small Group ║ Kids ║ Adults ║ Elders ║
╠═══════════╬═════════════╬══════╬════════╬════════╣
║         1 ║           1 ║   10 ║     20 ║      5 ║
║         1 ║           2 ║   15 ║     10 ║     10 ║
║         2 ║           1 ║   20 ║      0 ║     15 ║
╚═══════════╩═════════════╩══════╩════════╩════════╝

变成这样的事情?

╔═══════════╦═════════════╦══════╦════════╦════════╦═════════════╦══════╦════════╦════════╗
║ Big Group ║ Small Group ║ Kids ║ Adults ║ Elders ║ Small Group ║ Kids ║ Adults ║ Elders ║
╠═══════════╬═════════════╬══════╬════════╬════════╬═════════════╬══════╬════════╬════════╣
║         1 ║           1 ║   10 ║     20 ║      5 ║           2 ║   15 ║     10 ║     10 ║
║         2 ║           1 ║   20 ║      0 ║     15 ║             ║      ║        ║        ║
╚═══════════╩═════════════╩══════╩════════╩════════╩═════════════╩══════╩════════╩════════╝

每个 Big group 的小组数量是可变的,这就是我难以理解的地方。

谁能帮我?提前致谢

标签: sqloraclepivot

解决方案


有一种方法,但使用的开销PIVOT是提供需要旋转的所有值的列表。

由于您还需要对每个小组进行透视,我们需要在大组和小组之间创建一个虚拟列,以便在透视子句中使用,如下所示

with table1
as
(select 1 bg
       ,1 sg,10 kids
       ,20 adult 
   from dual
 union all
 select 1,2,15,25 from dual
 union all
 select 2,1,20,0 from dual
)
select *
from 
(
select t1.*,t1.bg||'_'||t1.sg piv
  from table1 t1
)
pivot
(
max(sg) sg,max(kids) kids,max(adult) adult
for piv in ('1_1' as bg1_sg1
           ,'1_2' as bg2_sg2
           ,'2_1' as bg2_sg1)
)
order by bg

演示


推荐阅读