Oracle按日期字段合并多行数据的SQL查询实现方法
Oracle按日期合并行(行转列)实现方案
方案1:使用PIVOT函数(Oracle 11g及以上版本适用)
这是Oracle官方提供的行转列专用函数,语法更简洁:
SELECT * FROM ( -- 内层查询取出需要用到的三个核心字段:日期、指标类型、指标数值 SELECT 日期字段, 指标类型字段, 指标数值字段 FROM 你的表名 ) PIVOT ( -- 聚合函数,同一日期同一指标只有1条数据时MAX/MIN/AVG效果一致,多值可根据需求改SUM/COUNT MAX(指标数值字段) -- 枚举所有需要转成列的指标值,别名可自定义 FOR 指标类型字段 IN ('出勤' AS 出勤, '请假' AS 请假, '旷工' AS 旷工) ) ORDER BY 日期字段;
方案2:CASE+聚合函数(全Oracle版本兼容)
如果使用的是11g以下的旧版本Oracle,可以用通用写法实现:
SELECT 日期字段, MAX(CASE WHEN 指标类型字段 = '出勤' THEN 指标数值字段 END) AS 出勤, MAX(CASE WHEN 指标类型字段 = '请假' THEN 指标数值字段 END) AS 请假, MAX(CASE WHEN 指标类型字段 = '旷工' THEN 指标数值字段 END) AS 旷工 FROM 你的表名 GROUP BY 日期字段 ORDER BY 日期字段;
注意事项
- 请将语句中的
你的表名、日期字段、指标类型字段、指标数值字段替换为你实际表的对应字段名 - IN子句里的指标枚举值需要和你实际业务里的类型值完全匹配,有多少种指标就加多少条对应规则
- 如果同一日期同一类型存在多条数据,可根据业务需求调整聚合函数,比如需要统计总和就把
MAX改为SUM即可
内容的提问来源于stack exchange,提问作者CreationSL
相关产品推荐
相关产品推荐

