通过忽略 null/empty 值在 Sqlite 中查找 AVG

find AVG in Sqlite by ignoring null/empty value

这是我的数据库

id mark
1 80
2 60
1
2 80

我的代码:

SELECT id as dd,AVG(mark) as avg 
FROM  Mark_O 
WHERE mark IS NOT NULL 
GROUP BY id

输出

id mark
1 40
2 70

我怎样才能得到这个

id mark
1 80
2 70

AVG() 默认情况下会忽略 NULL,因此如果 mark 的 empty/blank 值为 NULL,您的代码将按预期工作。
参见 demo.

因此,empty/blank 值要么是 '' 要么包含空格,并且 SQLite 在执行数值计算时以及在 [=11 等聚合函数中使用时将其隐式转换为 0 =].

最好的办法是更新您的 table,以便将这些 empty/blank 值替换为 NULLs:

UPDATE Mark_O
SET mark = NULL
WHERE TRIM(mark) = ''

然后你可以在没有条件 WHERE mark IS NOT NULL.
的情况下使用你的代码 参见 demo.

您可以调整 WHERE 子句。一种简单的方法是:

SELECT id as dd,AVG(mark) as avg 
FROM  Mark_O 
WHERE mark > 0
GROUP BY id;

虽然这不允许显式 '0' 标记。如果您想允许这样做,那么您需要知道“缺失”值是什么。如果是空字符串:

SELECT id as dd,AVG(mark) as avg 
FROM  Mark_O 
WHERE mark <> ''
GROUP BY id;

请注意,这两个条件也会过滤掉 NULL 行。但是,无论如何,它们都不会被计入 AVG()