SQL分组别名列问题求助:按ARI_APLNO汇总正负数值
问题分析与解决方法
你的代码存在两个核心问题:
- GROUP BY无法直接使用SELECT中的别名:SQL的执行顺序是先处理
FROM和GROUP BY,再执行SELECT生成别名,所以GROUP BY TotalValue会报错(不同数据库报错信息可能不同,但本质是别名未被识别)。 - 聚合逻辑错误:你需要按
ARI_APLNO汇总TotalValue的总和,但当前代码没有使用聚合函数SUM(),反而把TotalValue加入分组条件,这会得到ARI_APLNO和TotalValue的唯一组合,而不是每个ARI_APLNO的合计值。
正确的实现方式
方式一:直接在聚合函数中嵌入CASE表达式
把计算TotalValue的CASE逻辑直接放到SUM()里,仅按ARI_APLNO分组:
SELECT ARI_APLNO, SUM( CASE WHEN ARI_TYPE = 1 OR ARI_TYPE = 3 THEN ARI_AMOUNT + ARI_SLSTAX WHEN ARI_TYPE = 2 AND ARI_AMOUNT < 0 THEN ARI_AMOUNT * -1 WHEN ARI_TYPE = 5 THEN (ARI_AMOUNT + ARI_SLSTAX) * -1 ELSE -ARI_AMOUNT END ) AS TotalValueSum FROM dbo.ARITEMA GROUP BY ARI_APLNO
方式二:使用CTE/子查询先计算单行TotalValue
如果CASE逻辑比较复杂,先通过CTE(公共表表达式)或子查询算出每一行的TotalValue,再在外层分组求和:
CTE版本
WITH ItemValues AS ( SELECT ARI_APLNO, CASE WHEN ARI_TYPE = 1 OR ARI_TYPE = 3 THEN ARI_AMOUNT + ARI_SLSTAX WHEN ARI_TYPE = 2 AND ARI_AMOUNT < 0 THEN ARI_AMOUNT * -1 WHEN ARI_TYPE = 5 THEN (ARI_AMOUNT + ARI_SLSTAX) * -1 ELSE -ARI_AMOUNT END AS TotalValue FROM dbo.ARITEMA ) SELECT ARI_APLNO, SUM(TotalValue) AS TotalValueSum FROM ItemValues GROUP BY ARI_APLNO
子查询版本
SELECT ARI_APLNO, SUM(TotalValue) AS TotalValueSum FROM ( SELECT ARI_APLNO, CASE WHEN ARI_TYPE = 1 OR ARI_TYPE = 3 THEN ARI_AMOUNT + ARI_SLSTAX WHEN ARI_TYPE = 2 AND ARI_AMOUNT < 0 THEN ARI_AMOUNT * -1 WHEN ARI_TYPE = 5 THEN (ARI_AMOUNT + ARI_SLSTAX) * -1 ELSE -ARI_AMOUNT END AS TotalValue FROM dbo.ARITEMA ) AS SubQuery GROUP BY ARI_APLNO
内容的提问来源于stack exchange,提问作者WickedyWack
相关产品推荐
相关产品推荐

