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

Oracle或Excel中同一EMPLID多行转多列的实现方法咨询

行转列实现方案(学生成绩单条记录化)

一、Oracle SQL实现方法

1. PIVOT函数(Oracle 11g+推荐)

如果课程是固定的,直接用静态PIVOT:

SELECT *
FROM (
    SELECT EMPLID, CRSE, GRD
    FROM STUDENT_GRADES -- 替换成你的实际表名
)
PIVOT (
    MAX(GRD) FOR CRSE IN (
        'ENG101' AS ENG101,
        'MATH101' AS MATH101,
        'PHY101' AS PHY101 -- 按需添加所有课程
    )
)
ORDER BY EMPLID;

要是课程不固定(随时新增),用动态SQL自动生成列:

DECLARE
    v_cols VARCHAR2(1000);
BEGIN
    -- 自动拼接所有课程的列定义
    SELECT LISTAGG('''' || CRSE || ''' AS ' || CRSE, ', ') WITHIN GROUP (ORDER BY CRSE)
    INTO v_cols
    FROM (SELECT DISTINCT CRSE FROM STUDENT_GRADES);

    -- 执行动态行转列查询
    EXECUTE IMMEDIATE '
        SELECT *
        FROM (
            SELECT EMPLID, CRSE, GRD
            FROM STUDENT_GRADES
        )
        PIVOT (
            MAX(GRD) FOR CRSE IN (' || v_cols || ')
        )
        ORDER BY EMPLID'
    ;
END;
/

2. 条件聚合(兼容低版本Oracle)

如果你的Oracle版本低于11g,用条件判断+聚合函数实现:

SELECT
    EMPLID,
    MAX(CASE WHEN CRSE = 'ENG101' THEN GRD END) AS ENG101,
    MAX(CASE WHEN CRSE = 'MATH101' THEN GRD END) AS MATH101,
    MAX(CASE WHEN CRSE = 'PHY101' THEN GRD END) AS PHY101 -- 按需添加课程
FROM STUDENT_GRADES
GROUP BY EMPLID
ORDER BY EMPLID;

二、Excel实现方法

1. 数据透视表(快速上手)

  • 选中所有成绩数据(包含表头),点击「插入」→「数据透视表」,选好放置位置
  • 透视表字段设置:
    • 把「EMPLID」拖到「行」区域
    • 把「CRSE」拖到「列」区域
    • 把「GRD」拖到「值」区域,右键点击值区域的「GRD」→「值字段设置」,选「最大值」(或其他聚合方式,结果一致)
  • 格式调整:右键行标签→「合并居中单元格」,让每个学生ID只显示一行,和目标格式匹配。

2. INDEX+MATCH函数(手动定制)

假设原始数据在A1:D列(A=EMPLID,B=TERM,C=CRSE,D=GRD):

  • 新表A列先提取去重的EMPLID(用「数据」→「删除重复值」处理)
  • B1输入第一个课程名,B2单元格输入数组公式:
=INDEX($D:$D,MATCH($A2&"|"&B$1,$A:$A&"|"&$C:$C,0))

按Ctrl+Shift+Enter完成输入(Excel 365及以上直接回车),然后横向、纵向填充公式即可。

内容的提问来源于stack exchange,提问作者Ahmed Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 07:17:38