mysql 检查GROUP BY中的所有空值[重复]

9njqaruj  于 2023-01-08  发布在  Mysql
关注(0)|答案(2)|浏览(182)
    • 此问题在此处已有答案**:

MySQL AVG() return 0 if NULL(3个答案)
14小时前关门了。
我有下面的结构

id val
1 ...
.
.
2 ...
.
.
3 null
3 null
3 null
4 ...
.
.

基本上每个id都有多个值。一个id要么所有值都是整数,要么所有值都是空
我想要的是对val group by id执行聚合(如AVG)。如果该id有空值,我想在那里放置5。

1

SELECT id, (CASE SUM(val) WHEN null THEN 5 ELSE AVG(val) END) AS ac FROM tt GROUP BY id
> executes ELSE even for id = 3

在CASE中,应该有一个聚合函数,当对空值执行时会给出空值。

SELECT SUM(val) FROM tt WHERE id = 3
> null

它在这里给出了null,但是在main语句中不起作用。我猜它与等式的类型有关,因此尝试了WHEN IS NULL,但是它是一个语法错误。
此外,是否有一些更标准的方法来指示一组值为全空,而不是使用SUM或MAX。

l3zydbqr

l3zydbqr1#

可以使用if条件:

select id, If(sum(val) is null, 5, AVG(val)) as average
FROM tt
group by id

检查此处:https://dbfiddle.uk/Uso9nNTM

cngwdvgl

cngwdvgl2#

你的CASE表达式的确切问题在于,在MySQL中检查null时,我们必须使用IS NULL而不是equality。

CASE WHEN SUM(val) IS NULL THEN 5 ELSE AVG(val) END

但是我们也可以只使用COALESCE()来为那些id组分配一个平均值5。

SELECT id, COALESCE(AVG(val), 5) AS avg_val
FROM tt
GROUP BY id;

注意,AVG()函数默认忽略空值。因此,只有当id组中的 every 记录的val为空值时,表达式AVG(val)才为空值。

相关问题