Oracle SQL实现重复行扁平化:多讲师课程转列展示
解决课程讲师信息扁平化(行转列)问题
如果你正面临这样的场景:查询课程与讲师的关联数据时,同一课程会因为多位讲师返回多行重复结果,需要把这些讲师信息横向展开为Primary Instructor、Instructor 2、Instructor 3这类专属列,实现结果的扁平化展示,下面的方案可以帮到你。
原查询的多行输出
| 课程 | 讲师 | 是否主讲 |
|---|---|---|
| CS 300 | John Doe | Y |
| CS 300 | Jane Public | |
| ECON 101 | Richard Roe | Y |
目标的扁平化输出
| 课程 | Primary_Instructor | Instructor2 | Instructor3 |
|---|---|---|---|
| CS 300 | John Doe | Jane Public | |
| ECON 101 | Richard Roe |
最终解决方案代码
我们可以结合窗口函数ROW_NUMBER()和PIVOT语法来实现需求,具体SQL如下:
SELECT * FROM ( SELECT COURSE.TITLE "Course", PERSON.FIRST_NAME ||' '|| PERSON.LAST_NAME "Instructor", -- 按课程分组,将主讲讲师优先标记为第1位,其余讲师按顺序编号 ROW_NUMBER() OVER (PARTITION BY INSTRUCTOR.COURSE_KEY ORDER BY INSTRUCTOR.PRIMARY_IND DESC) AS INS_ORDER FROM COURSE JOIN INSTRUCTOR ON COURSE.COURSE_KEY = INSTRUCTOR.COURSE_KEY JOIN PERSON ON INSTRUCTOR.ID = PERSON.ID ) PIVOT ( -- 按序号提取对应讲师姓名,每个序号对应唯一讲师,用MAX/MIN聚合均可 MAX("Instructor") FOR INS_ORDER IN ( 1 AS PRIMARY_INSTRUCTOR, 2 AS INSTRUCTOR2, 3 AS INSTRUCTOR3 ) )
代码逻辑说明
- 窗口函数
ROW_NUMBER():通过PARTITION BY INSTRUCTOR.COURSE_KEY按课程分组,再用ORDER BY INSTRUCTOR.PRIMARY_IND DESC确保主讲讲师(PRIMARY_IND='Y')被排在第1位,其余讲师会按默认顺序依次编号为2、3... PIVOT行转列:把每个课程分组内的讲师按编号横向展开成独立列,这里用MAX("Instructor")是因为每个编号对应唯一的讲师,聚合函数只是用来提取对应行的讲师姓名,换成MIN也能得到相同结果。
如果课程讲师超过3位,只需要在PIVOT的IN子句里继续添加4 AS INSTRUCTOR4这类字段即可适配。
内容的提问来源于stack exchange,提问作者Dong Cao-Huu
相关产品推荐
相关产品推荐

