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
相关产品推荐
相关产品推荐

