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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:25:37