遇到一个问题,前辈们之前将一张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......
完工!!!