MySQL两种不同SUM计算结构按ID分组返回相同结果相关问题咨询
两个SQL分组表达式结果一致的原理说明
仅当你按ID分组后的每一组内,所有行都满足row1 ≥ row2时,这两个表达式的计算结果才会完全相等,二者本身的通用逻辑并不等价。
两个表达式的逻辑差异
第一个表达式
if(sum(row1)>sum(row2) ,sum(row1)-sum(row2),0)
执行逻辑是先对整组的row1、row2分别求和得到sum_row1、sum_row2,最后只做一次整组级别的判断:如果sum_row1大于sum_row2就返回二者差值,否则返回0,属于先聚合、后判断的逻辑。第二个表达式
sum(if(row1>row2 ,row1-row2,0))
执行逻辑是先遍历组内每一行单独判断:如果当前行的row1大于row2,就返回当前行的差值,否则返回0,最后把所有行的返回值求和,属于先逐行判断、后聚合的逻辑。
结果一致的原因
当分组内所有行都满足row1 ≥ row2时,第二个表达式的逐行判断会给每一行都返回row1 - row2,求和后的总结果就是sum(row1) - sum(row2);此时整组的sum(row1)必然大于sum(row2),第一个表达式的返回值也恰好是sum(row1) - sum(row2),二者结果就会完全重合。
如果组内存在row1 < row2的行,二者结果就会出现差异:比如某组有两行,第一行row1=5、row2=1,第二行row1=1、row2=3:
- 第一个表达式计算得
sum(row1)=6、sum(row2)=4,返回结果是2 - 第二个表达式逐行计算得
4 + 0 = 4,和第一个结果明显不同
内容的提问来源于stack exchange,提问作者Kalferian
相关产品推荐
相关产品推荐

