通过忽略 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 值替换为 NULL
s:
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()
。
这是我的数据库
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 值替换为 NULL
s:
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()
。