You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL实现重复行扁平化:多讲师课程转列展示

解决课程讲师信息扁平化(行转列)问题

如果你正面临这样的场景:查询课程与讲师的关联数据时,同一课程会因为多位讲师返回多行重复结果,需要把这些讲师信息横向展开为Primary Instructor、Instructor 2、Instructor 3这类专属列,实现结果的扁平化展示,下面的方案可以帮到你。

原查询的多行输出

课程讲师是否主讲
CS 300John DoeY
CS 300Jane Public
ECON 101Richard RoeY

目标的扁平化输出

课程Primary_InstructorInstructor2Instructor3
CS 300John DoeJane Public
ECON 101Richard 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
    )
)

代码逻辑说明

  1. 窗口函数ROW_NUMBER():通过PARTITION BY INSTRUCTOR.COURSE_KEY按课程分组,再用ORDER BY INSTRUCTOR.PRIMARY_IND DESC确保主讲讲师(PRIMARY_IND='Y')被排在第1位,其余讲师会按默认顺序依次编号为2、3...
  2. PIVOT行转列:把每个课程分组内的讲师按编号横向展开成独立列,这里用MAX("Instructor")是因为每个编号对应唯一的讲师,聚合函数只是用来提取对应行的讲师姓名,换成MIN也能得到相同结果。

如果课程讲师超过3位,只需要在PIVOT的IN子句里继续添加4 AS INSTRUCTOR4这类字段即可适配。

内容的提问来源于stack exchange,提问作者Dong Cao-Huu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:17:43