SQL中含CASE子句的聚合运算求和与除法语法问题排查
问题分析与修正
为什么返回10?
你的代码存在两个关键问题,直接导致结果与预期不符:
- 运算顺序错误:没有给「sum(tb1.col1) + count(...)」整体添加括号,SQL会优先执行除法运算
count(...) / sum(tb1.col3),再将结果与sum(tb1.col1)相加。 - CASE WHEN条件不匹配测试数据:测试数据中
tb2.col2的值是5,但你的条件判断是tb2.col2 = 1,这导致count(...)返回0(没有符合条件的行)。0除以50仍为0,最终结果就是10 + 0 = 10。
如何得到期望的0.3?
从你期望的公式(10+5)/50=0.3来看,你实际需要的是将tb2.col2的值(而非符合条件的行数)加到sum(tb1.col1)中,而非“计数”。结合运算顺序修正,正确代码如下:
round( (sum(tb1.col1) + sum(case when tb2.col2 = 5 then tb2.col2 else 0 end)) / sum(tb1.col3), 2 )
如果你的业务逻辑确实是统计符合条件的行数(比如测试数据中的5是笔误,实际应为1),则修正条件和运算顺序后的代码为:
round( (sum(tb1.col1) + count(case when tb2.col2 = 1 then 1 else null end)) / sum(tb1.col3), 2 )
内容的提问来源于stack exchange,提问作者Andrew Buchanan
相关产品推荐
相关产品推荐

