忽略平均数学上的空值,但在结果上显示为零
Ignore empty values on average math, but show it as zero on result
我需要计算字段的 Average
值,但需要发生两件事:
1- 空值不应计入平均数学。
2- 如果该字段为空,它仍然必须显示在结果中(平均 === 0)
假设我有这个数据集:
-----------------------
Code | valField | Date
-----------------------
A | | 2020-09-08
B | 12 | 2020-09-09
A | 10 | 2020-09-08
B | 15 | 2020-09-09
B | | 2020-09-09
C | | 2020-09-09
所以我需要 day
的平均值。如您所见,我们有:
A = { 空,10 }
B = { 12, 15, 空}
C = {空}
我需要这样计算平均值:
A 的平均值 = 10
B 的平均值 = (12+15)/2(因为我们有 2 个非空值)
C 的平均值 = 0(它没有单个值,但我需要它在结果上显示为 0)
到目前为止我可以完成这两个要求,但不是同时完成。
此查询将显示空值,但也会计算 average math
上的空字段
SELECT AVG(valField) FROM myTable;
所以 B 的平均值 = (12+15+0)/3 - 错误!
现在这将忽略空值,AVG 数学将是正确的,但 C
不会显示。
SELECT AVG(valFIeld) FROM myTable WHERE valField <> ''
我怎样才能满足这两个要求?
我想你想要:
SELECT code, COALESCE(AVG(valField), 0) FROM myTable GROUP BY code
这假设 valField
是数字数据类型,并且 empty 你的意思是 null
.
这是幕后发生的事情:
avg()
,与大多数其他聚合函数一样,忽略 null
值
如果所有值都是null
,那么avg()
就是returnnull
;您可以使用 coalesce()
将其替换为 0
根据你的评论我了解到,你将 valField
定义为 varchar,因此你可以使用下一个技巧:
select
Code,
coalesce(avg(nullif(valField, '')), 0) as avg_value
from tbl
group by Code;
上测试查询
这里我使用NULLIF函数在计算平均值之前将空值转换为null
这应该很容易,只需创建两个查询,一个使用非空值计算平均值,另一个计算数据中没有值的代码。
select round(avg(valField)) as avg, code from new where valField is not null group by Code
union all
select 0 as avg, code from new group by Code having avg(valField) is null;
我需要计算字段的 Average
值,但需要发生两件事:
1- 空值不应计入平均数学。
2- 如果该字段为空,它仍然必须显示在结果中(平均 === 0)
假设我有这个数据集:
-----------------------
Code | valField | Date
-----------------------
A | | 2020-09-08
B | 12 | 2020-09-09
A | 10 | 2020-09-08
B | 15 | 2020-09-09
B | | 2020-09-09
C | | 2020-09-09
所以我需要 day
的平均值。如您所见,我们有:
A = { 空,10 }
B = { 12, 15, 空}
C = {空}
我需要这样计算平均值:
A 的平均值 = 10
B 的平均值 = (12+15)/2(因为我们有 2 个非空值)
C 的平均值 = 0(它没有单个值,但我需要它在结果上显示为 0)
到目前为止我可以完成这两个要求,但不是同时完成。
此查询将显示空值,但也会计算 average math
SELECT AVG(valField) FROM myTable;
所以 B 的平均值 = (12+15+0)/3 - 错误!
现在这将忽略空值,AVG 数学将是正确的,但 C
不会显示。
SELECT AVG(valFIeld) FROM myTable WHERE valField <> ''
我怎样才能满足这两个要求?
我想你想要:
SELECT code, COALESCE(AVG(valField), 0) FROM myTable GROUP BY code
这假设 valField
是数字数据类型,并且 empty 你的意思是 null
.
这是幕后发生的事情:
avg()
,与大多数其他聚合函数一样,忽略null
值如果所有值都是
将其替换为null
,那么avg()
就是returnnull
;您可以使用coalesce()
0
根据你的评论我了解到,你将 valField
定义为 varchar,因此你可以使用下一个技巧:
select
Code,
coalesce(avg(nullif(valField, '')), 0) as avg_value
from tbl
group by Code;
上测试查询
这里我使用NULLIF函数在计算平均值之前将空值转换为null
这应该很容易,只需创建两个查询,一个使用非空值计算平均值,另一个计算数据中没有值的代码。
select round(avg(valField)) as avg, code from new where valField is not null group by Code
union all
select 0 as avg, code from new group by Code having avg(valField) is null;