上一篇讲到了Oracle分组排序https://blog.csdn.net/luohualiushui1/article/details/86601564
在实际的业务里面有如下的需求:
表test按字段a分组,字段b排序然后要纵表转为横表把分组排序每组前N行数据变为新的结果集的N*m列数据(m为test表分组统计的字段数)
例如成绩表,表里面有姓名,科目,成绩
需要生成的结果集是姓名,科目1,科目1成绩,科目2,科目2成绩,科目3,科目3成绩
第一步当然就是分组排序
select row_number()over(partition by 姓名 order by 科目) rn,t.* from 成绩表 t
关键的处理来了
select
h.姓名,
listagg(科目,',') within group (order by 科目)over(partition by 姓名) 科目,
listagg(成绩,',') within group (order by 科目)over(partition by 姓名) 成绩
from (select row_number()over(partition by 姓名 order by 科目) rn,t.* from 成绩表 t) h
这一步大家可能看晕了,这一步是中间步骤不急,继续
select
hh.姓名,
REGEXP_SUBSTR(科目,'[^,]+',1,1) 科目1,
REGEXP_SUBSTR(成绩,'[^,]+',1,1) 科目1成绩,
REGEXP_SUBSTR(科目,'[^,]+',1,2) 科目2,
REGEXP_SUBSTR(成绩,'[^,]+',1,2) 科目2成绩,
REGEXP_SUBSTR(科目,'[^,]+',1,3) 科目3,
REGEXP_SUBSTR(成绩,'[^,]+',1,3) 科目3成绩
from (select
h.姓名,
listagg(科目,',') within group (order by 科目)over(partition by 姓名) 科目,
listagg(成绩,',') within group (order by 科目)over(partition by 姓名) 成绩
from (select row_number()over(partition by 姓名 order by 科目) rn,t.* from 成绩表 t) h) hh
到这一步搞定,这里巧用了字符串合并和割接解决,大家可以参考使用