计算SQLite中与空值关系的平均值

时间:2016-10-14 02:13:45

标签: sql database sqlite subquery

当我在表中有空字段时,我很难计算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))

然而,这不起作用。有什么想法吗?

2 个答案:

答案 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)
     );

内部子查询是多余的,但如果你想要有效或可维护的查询,你就可以使用戈登的答案。