如何实现列平均值计算:全为-1返回-1,否则排除-1行计算
解决yearData表quarter列的平均值计算需求
我来帮你搞定这个SQL计算需求~针对你提出的“全为-1返回-1,否则忽略-1算平均”的要求,这里有两种简洁可靠的写法:
方法一:利用NULL自动忽略特性
这是最简洁的写法,利用NULLIF把-1转为NULL(AVG函数会自动忽略NULL值),再用COALESCE处理全为-1的情况:
SELECT COALESCE(AVG(NULLIF(quarter, -1)), -1) AS quarter_average FROM yearData;
逻辑拆解:
NULLIF(quarter, -1):将所有值为-1的quarter字段转为NULL,这样AVG计算时会直接跳过这些行AVG(...):计算剩余非NULL值的平均值;如果所有行都是-1,AVG会返回NULLCOALESCE(..., -1):如果AVG结果是NULL(即全为-1),就返回-1,否则返回计算出的平均值
方法二:用CASE判断非-1行数
如果你更倾向于显式判断的写法,可以用CASE语句先统计非-1值的数量,再决定返回结果:
SELECT CASE WHEN COUNT(CASE WHEN quarter != -1 THEN 1 END) = 0 THEN -1 ELSE AVG(CASE WHEN quarter != -1 THEN quarter END) END AS quarter_average FROM yearData;
逻辑拆解:
COUNT(CASE WHEN quarter != -1 THEN 1 END):统计表中值不为-1的行数,如果结果为0,说明所有行都是-1- 当行数为0时返回-1,否则计算所有非-1值的平均值
另外提一下你原来的SQL存在的小问题:字段名拼写错误(QARTER应该是quarter),而且只做了求和操作,没有完成平均值计算,也没处理全为-1的特殊情况,调整成上面的写法就能满足需求啦~
内容的提问来源于stack exchange,提问作者La Reyna
相关产品推荐
相关产品推荐

