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

Oracle SQL实现按年度、季度和指标计算同比变化百分比

解决同季度同指标的年度变化百分比计算问题

你的核心问题是窗口函数未正确分区,导致无法定位到同指标、同季度的上一年数据。以下是修正后的Oracle SQL代码及关键调整说明:

修正后的查询代码

SELECT 
    s.YEAR,
    t.quarter,
    CASE WHEN fruits IN ('tangerine','lemon') THEN 'orange'
         ELSE fruits
    END AS metric,
    COUNT(DISTINCT s.ID) AS cnt,
    -- 计算同比变化百分比:(当年值 - 上年值)/上年值 * 100,保留两位小数
    ROUND(
        CASE 
            WHEN LAG(COUNT(DISTINCT s.ID)) OVER (PARTITION BY metric, t.quarter ORDER BY s.YEAR) IS NOT NULL
            THEN (COUNT(DISTINCT s.ID) - LAG(COUNT(DISTINCT s.ID)) OVER (PARTITION BY metric, t.quarter ORDER BY s.YEAR)) 
                 / LAG(COUNT(DISTINCT s.ID)) OVER (PARTITION BY metric, t.quarter ORDER BY s.YEAR) * 100
            ELSE NULL -- 2021年无上年数据,显示NULL
        END,
        2
    ) AS pct_change
FROM s
JOIN sc ON s.KEY = sc.KEY
JOIN c ON sc.KEY = c.KEY
JOIN t ON s.quarter = t.quarter
WHERE s.YEAR BETWEEN '2021' AND '2022'
  AND s.quarter IN ('1','2','3')
GROUP BY 
    s.YEAR,
    t.quarter,
    CASE WHEN fruits IN ('tangerine','lemon') THEN 'orange'
         ELSE fruits
    END
ORDER BY metric, t.quarter, s.YEAR;

关键调整说明

  • 窗口函数分区与排序:添加PARTITION BY metric, t.quarter,确保仅在相同指标、相同季度的分组内匹配数据;ORDER BY s.YEAR保证按年度顺序获取上一年的统计值。
  • 使用LAG而非LEAD:你需要用2022年数据对比2021年,LAG函数会返回当前行的上一行数据(按年度升序排列时,2022的上一行就是2021的同组数据),LEAD会取后一行,不符合需求。
  • 空值处理:2021年无上年数据,通过CASE判断后返回NULL,避免计算报错。
  • 字段名优化:将COUNT改为cnt,避免与Oracle关键字冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:06:05