无需子查询:按年月汇总发票数据及解决yerQty字段缺失问题
解决方案:无Subquery实现月度汇总+年度总计
先帮你梳理下需求核心:按月份聚合发票数据,同时展示全年度总金额和全年度ss类别的总数量,且不能用子查询。你的当前查询主要问题是没正确处理年度总数量的窗口计算,同时分组逻辑和聚合函数的搭配存在语法错误。
正确的SQL语句
SELECT Month, SUM(Amt) OVER () AS yearamt, SUM(Amt) AS Amt, SUM(CASE WHEN Desc = 'ss' THEN QTy ELSE NULL END) AS QTy, SUM(CASE WHEN Desc = 'ss' THEN QTy ELSE 0 END) OVER () AS yerQty FROM Table1 GROUP BY Month ORDER BY Month;
语句细节解释
- 年度总金额
yearamt:用SUM(Amt) OVER ()窗口函数,不指定分区范围,直接计算全表Amt的总和,这样每个月度行都会重复显示这个年度总计值。 - 月度Amt汇总:
SUM(Amt)配合GROUP BY Month,得到每个月的总金额。 - 月度ss类别的QTy汇总:
SUM(CASE WHEN Desc = 'ss' THEN QTy ELSE NULL END),只对Desc为ss的行累加QTy,非ss行直接返回NULL,完全匹配你目标结果里Month4的QTy为null的情况。 - 年度ss类别的总数量
yerQty:用窗口函数SUM(CASE WHEN Desc = 'ss' THEN QTy ELSE 0 END) OVER (),先把非ss类别的QTy转为0,再计算全表的总和,就能得到年度ss类别的总数量9。
对原查询的修正点
- 原查询里
Sum(amount))amount存在语法错误,多了一个闭合括号 - 原查询分组包含了
DESC,会导致按「月份+Desc」分组,而非按月份整体汇总,所以要去掉DESC的分组项 - 年度总数量需要通过窗口函数计算全表的ss类别QTy总和,而非仅在分组内计算
内容的提问来源于stack exchange,提问作者user2302158
相关产品推荐
相关产品推荐

