SQL中SUM(col1+col2)/COUNT(1)及其替代写法的计算差异咨询
SQL聚合表达式不同写法的结果一致性核查
核心结论:5种写法全部存在计算结果不一致的可能性,其中写法1和写法2的差异最容易被开发人员忽略
重点核查:写法1与写法2的差异
两种写法的原始表达式:
- 写法1:
SUM(col1 + col2) / COUNT(1) - 写法2:
AVG(col1 + col2)
两者结果会对不上的核心原因,是SQL通用的空值处理规则和聚合函数口径差异:只要col1或col2任意一个字段值为NULL,col1 + col2的计算结果就会直接为NULL;而不同聚合函数对NULL值的处理逻辑存在明确区分:
SUM()会自动跳过传入参数为NULL的行,对剩余非NULL值做累加AVG()会自动跳过传入参数为NULL的行,仅对剩余非NULL值计算算术平均COUNT(1)会统计所有行的总数,不管任意字段是否为NULL,不存在跳过行为
举个非常直观的数值场景:假设表内一共10条数据,其中3条因为col1或col2是NULL,导致col1+col2算出来直接是NULL;剩下7条非NULL的col1+col2加起来总和是70。
- 写法1计算:把非NULL的
col1+col2值累加得到70,统计全量行数得到COUNT(1)=10,最终结果为70/10=7 - 写法2计算:自动排除3条结果为NULL的行,仅对7条非NULL值算平均,最终结果为70/7=10
两者最终结果完全不同。
其余写法的差异场景
- 写法3:
(SUM(col1) + SUM(col2)) / COUNT(1)
分子部分为两个独立列的SUM值相加,和逐行计算col1+col2再做累加的逻辑存在本质差异。比如某行col1=5、col2=NULL,逐行计算col1+col2结果为NULL,不会进入写法1的SUM累加;但写法3的SUM(col1)会把这行的5计入累加值,SUM(col2)因col2为NULL自动跳过该行的col2值,最终分子的计算结果和写法1的分子不一致,结果自然可能出现偏差。 - 写法4:
(SUM(col1) + SUM(col2)) / COUNT(col1)COUNT(col1)会自动跳过col1为NULL的行做计数,和其他写法使用的全量计数(COUNT(1))逻辑完全不同,只要表内存在col1为NULL的行,分母的统计值就和其余写法存在差异,计算结果必然可能不一致。 - 写法5:
(SUM(col1) + SUM(col2)) / COUNT(col2)
同理,COUNT(col2)会自动跳过col2为NULL的行做计数,和其他写法的分母统计口径存在差异,只要存在col2为NULL的行,计算结果就可能出现偏差。
内容的提问来源于stack exchange,提问作者supernatural
相关产品推荐
相关产品推荐

