SQL语法报错:AS LastYearVolumeBilled行出错,如何在单SELECT中加两个CASE WHEN
问题分析与修正方案
原SQL的核心问题是重复定义了FROM、WHERE和GROUP BY子句,语法结构完全混乱,这才触发了AS LastYearVolumeBilled行的语法错误。要在单个SELECT语句中同时统计当年和去年的计费量,正确做法是用条件聚合——在聚合函数里嵌套CASE WHEN,分别对当年、去年的数据计算,不用拆分多个查询。
修正后的SQL:
SELECT 'R-1' AS Year, -- 计算当年计费量 ROUND( SUM(CASE WHEN SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM SYSDATE) || '04') THEN SDBM_BILLED_UNITS END) / AVG(CASE WHEN SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM SYSDATE) || '04') THEN sdbm_billing_days END) / 1000, 2 ) AS CurrentYearVolumeBilled, -- 计算去年计费量 ROUND( SUM(CASE WHEN SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) || '04') THEN SDBM_BILLED_UNITS END) / AVG(CASE WHEN SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) || '04') THEN sdbm_billing_days END) / 1000, 2 ) AS LastYearVolumeBilled FROM t_servicedetail_billing WHERE SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM SYSDATE) || '04') OR SDBM_MONTH_YR = TO_NUMBER(EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -12)) || '04');
关键说明:
- 把当年、去年的月份条件合并到同一个
WHERE里,一次性筛选出需要的两组数据 - 用
SUM(CASE WHEN ... THEN 字段 END)和AVG(CASE WHEN ... THEN 字段 END)分别针对当年、去年的数据做聚合计算,确保只统计对应月份的数值 - 当前需求下无需额外
GROUP BY(如果要按多维度分组可再调整)
内容的提问来源于stack exchange,提问作者johnjs
相关产品推荐
相关产品推荐

