不同版本oracle数据列转行

来源:互联网 发布:3d数据图表制作软件 编辑:程序博客网 时间:2024/06/03 15:00

  遇到一个问题,前辈们之前将一张12题的评分卷在答案表中存了12次,查询的时候再关联查,造成的返回结果数量庞大,一条数据需要答案表12条结果。

            

(答案表) (数据表)

   为了减小查询开支,决定将同一id的数据整合为一条,效果如下:

            (效果视图)


    所以要将同一个id的得分列转行,但是不同的oracle版本操作不同,在此作说明:


    oracle 11g 操作就相对较简单:

  按照问题编号排序:

select id,LISTAGG(target_score, ',') WITHIN GROUP(ORDER BY target_id) target_score from EXAM_TARGET_SCORE group by id

    oracle 11g以下的版本要稍微复杂一点:

        1、首先列转行

select ID,wm_concat(target_score) as target_score from EXAM_TARGET_SCORE GROUP BY ID

  但是发现结果顺序是乱的,所以需要排序

2、排序

select ID,target_id,wm_concat(target_score) over(partition by id order by target_id) as target_score from EXAM_TARGET_SCORE

发现我们要筛选出最多的数据行,所以需要进行筛选操作

3、筛选

SELECT T1.ID,T1.target_score FROM(select ID,target_id,wm_concat(target_score) over(partition by id order by target_id) as target_score from EXAM_TARGET_SCORE) T1, (SELECT id,max(target_id) AS target_id from (select ID,target_id,wm_concat(target_score) over(partition by id order by target_id) as target_score from EXAM_TARGET_SCORE) t group by id) T2 WHERE T1.ID=T2.ID AND T1.target_id=T2.target_id ORDER BY T1.ID


4、添加视图

CREATE or replace VIEW VIEW_EXAM_TARGET_SCORE AS SELECT T1.ID,T1.target_score FROM......


完工!!!