SQL AVG函数使用疑问:如何排除含NULL的类别并计算指定颜色均值
解决方法:排除存在NULL值的类别并计算平均值
嘿,我懂你的需求了——你不是想忽略单个NULL行来算平均值,而是要彻底排除那些只要有一行数值是NULL的颜色类别,对吧?这里有几种实用的SQL写法帮你实现:
方法1:GROUP BY + HAVING 直接过滤
这是最简洁的实现方式,利用聚合函数的特性判断类别中是否存在NULL:
SELECT colour, AVG(value) AS avg_value FROM colour GROUP BY colour HAVING COUNT(value) = COUNT(*)
原理说明:
COUNT(*)会统计每个颜色类别的所有行数(包含含NULL的行)COUNT(value)只会统计每个类别中value不为NULL的行数- 当两者相等时,说明这个类别里没有任何一行的
value是NULL,自动排除了像white这种存在NULL的类别
方法2:用NOT EXISTS子查询过滤
如果你更喜欢直观的逻辑判断,这种写法会更易懂,直接排除存在NULL的颜色:
SELECT c.colour, AVG(c.value) AS avg_value FROM colour c WHERE NOT EXISTS ( SELECT 1 FROM colour c2 WHERE c2.colour = c.colour AND c2.value IS NULL ) GROUP BY c.colour
原理说明:
- 子查询会检查当前颜色是否存在任意一行
value为NULL的记录 NOT EXISTS会筛选出完全没有NULL记录的颜色,再对这些颜色计算平均值
这两种方法都会返回你想要的结果:
| colour | avg_value |
|---|---|
| red | 5 |
| blue | 5 |
内容的提问来源于stack exchange,提问作者Javallion
相关产品推荐
相关产品推荐

