Oracle SQL无聚合GROUP BY实现同EMPNO行转列数据合并
Oracle SQL 实现同一EMPNO多行非数值字段合并为一行
你可以通过聚合函数+GROUP BY的方式解决这个问题,非数值型字段同样可以使用MAX()或MIN()这类聚合函数提取有效非NULL值,具体修改后的SQL如下:
首先修正原语句的语法错误(CASE语句间缺少逗号),并添加聚合与分组逻辑:
SELECT EMPNO, MAX(CASE WHEN "GROUP" = 'Intro' THEN Role END) AS "Intro", MAX(CASE WHEN "GROUP" = 'Compliance' THEN Role END) AS "Compliance", MAX(CASE WHEN "GROUP" = 'Security' THEN Role END) AS "Security", MAX(CASE WHEN "GROUP" = 'Project' THEN Role END) AS "Project", MAX(CASE WHEN "GROUP" = 'Role Based' THEN Role END) AS "Role Based" FROM EMP_TBL GROUP BY EMPNO;
关键说明:
MAX()函数会自动忽略NULL值,对于同一EMPNO下的每个Training分组,只会保留唯一的非NULL Role值,从而将多行数据合并为一行。GROUP是Oracle的关键字,必须用双引号"GROUP"引起来,避免语法报错。- 如果需要保留
ICODE和Type字段,且同一EMPNO对应的这两个字段值唯一,可将它们加入GROUP BY子句:
SELECT EMPNO, ICODE, Type, MAX(CASE WHEN "GROUP" = 'Intro' THEN Role END) AS "Intro", MAX(CASE WHEN "GROUP" = 'Compliance' THEN Role END) AS "Compliance", MAX(CASE WHEN "GROUP" = 'Security' THEN Role END) AS "Security", MAX(CASE WHEN "GROUP" = 'Project' THEN Role END) AS "Project", MAX(CASE WHEN "GROUP" = 'Role Based' THEN Role END) AS "Role Based" FROM EMP_TBL GROUP BY EMPNO, ICODE, Type;
若同一EMPNO下的ICODE或Type存在多个不同值,需根据业务需求选择合适的聚合函数(如MAX()、MIN())来统一结果。
内容的提问来源于stack exchange,提问作者JakeNotFromStatefarm
相关产品推荐
相关产品推荐

