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
相关产品推荐
相关产品推荐

