当我在表中有空字段时,我很难计算SQL中的平均值。我想要包含null的字段,并在计算平均值之前用数字10替换它们。假设我有以下关系:
x | y
-------
j | 3
k | 4
l | NULL
n | 55
到目前为止,我的逻辑是获取所有字段y,其中存在空值并获取该表中项目的总和和计数,然后获取没有空值的字段的总和和计数。由此,我将总和和计数结合起来并计算平均值。到目前为止,我有以下查询:
SELECT sum1+sum2/c1+c2
FROM (SELECT sum(cap) as sum1, count(*) as c1 FROM courses)
UNION (SELECT SUM(null_fields) as sum2, c2
FROM (SELECT 10 as null_fields, count(*) as c2 FROM courses
WHERE cap IS NULL))
然而,这不起作用。有什么想法吗?
答案 0 :(得分:1)
使用coalesce()
:
select avg(coalesce(cap, 10))
from courses;
答案 1 :(得分:0)
您不能在compound query内使用括号,并且复合查询的列名仅由其中的第一个查询确定。 UNION删除重复项,如果NULL和非NULL部分结果碰巧具有相同的值,则不需要重复项。复合查询返回两行,因此您必须运行其他聚合:
SELECT sum(sum1) / sum(c1)
FROM (SELECT sum(cap) as sum1,
count(*) as c1
FROM courses
UNION ALL
SELECT SUM(null_fields) as sum2,
c2
FROM (SELECT 10 as null_fields,
count(*) as c2
FROM courses
WHERE cap IS NULL)
);
内部子查询是多余的,但如果你想要有效或可维护的查询,你就可以使用戈登的答案。