Oracle SQL如何查询两个指定日期间按月分组的薪资数据
Oracle数据库可行查询方案
本方案适配你当前使用的Oracle语法环境,完整代码如下:
-- 此处可直接修改起始、结束日期参数 WITH param AS ( SELECT TO_DATE('17/01/2020', 'dd/mm/yyyy') AS start_date, TO_DATE('10/03/2020', 'dd/mm/yyyy') AS end_date FROM dual ), -- 生成所有需要统计的月份区间 month_dim AS ( SELECT -- 当月第一天,用于分组和格式化 TRUNC(ADD_MONTHS(p.start_date, LEVEL - 1), 'mm') AS month_first_day, -- 统计区间起始:第一个月用参数起始日期,其余用当月第一天 CASE WHEN LEVEL = 1 THEN p.start_date ELSE TRUNC(ADD_MONTHS(p.start_date, LEVEL - 1), 'mm') END AS stat_start_date, -- 统计区间结束:最后一个月用参数结束日期,其余用当月最后一天 CASE WHEN TRUNC(ADD_MONTHS(p.start_date, LEVEL - 1), 'mm') = TRUNC(p.end_date, 'mm') THEN p.end_date ELSE LAST_DAY(TRUNC(ADD_MONTHS(p.start_date, LEVEL - 1), 'mm')) END AS stat_end_date FROM param p CONNECT BY TRUNC(ADD_MONTHS(p.start_date, LEVEL - 1), 'mm') <= TRUNC(p.end_date, 'mm') ) -- 关联业务表统计薪资总额 SELECT TO_CHAR(md.month_first_day, 'MON-YY') AS MONTH, NVL(SUM(eb.SALARY), 0) AS SALARY FROM month_dim md LEFT JOIN EMPLOYE_BG eb ON eb.CREATED_DATE BETWEEN md.stat_start_date AND md.stat_end_date GROUP BY md.month_first_day ORDER BY md.month_first_day;
原代码错误说明
- 语法错误:
add_months函数后多了多余的右括号,字段名拼写错误SALARAY应为SALARY - 缺少聚合逻辑:没有按月份分组求和,返回的是单条明细数据而非月度汇总
- 区间逻辑错误:没有处理首个统计区间从指定起始日期开始的要求,直接取整月会包含起始日期之前的当月数据
- 缺失月份维度:如果某个月无薪资数据会直接不显示,无法满足连续月份统计的需求
内容的提问来源于stack exchange,提问作者VGK
相关产品推荐
相关产品推荐

