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

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;

原代码错误说明

  1. 语法错误:add_months函数后多了多余的右括号,字段名拼写错误SALARAY应为SALARY
  2. 缺少聚合逻辑:没有按月份分组求和,返回的是单条明细数据而非月度汇总
  3. 区间逻辑错误:没有处理首个统计区间从指定起始日期开始的要求,直接取整月会包含起始日期之前的当月数据
  4. 缺失月份维度:如果某个月无薪资数据会直接不显示,无法满足连续月份统计的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:54:02