通过忽略 oracle 中分母的空值来求平均值 sql
finding average by ignoring null values from denominator in oracle sql
我们有table喜欢
现在我们必须根据权重计算col1,col2,col3,col4的平均值分别为0.5,1.0,0.5,1.0
所以公式看起来像 ((col1*0.5)+(col2*1)+(col3*0.5)+(col4*1))/(0.5+1+0.5+1)
但如果任何列的值为空,则不应在分母中考虑
例如,第 2 行的平均公式应为
((0.398160315*0.5)+(nvl(col2,0)*1)+(0*0.5)+(nvl(col4,0)*1))/(0.5+0.5) =0.199080161
在 sql 中计算
我可以通过 nvl(col1,0) 处理分子中的 null
但我该如何处理分母
您可以使用 nvl2()
:
(0.5*nvl(col1, 0) + 1.0*nvl(col2, 0) + 0.5*nvl(col3, 0) + 1.0*nvl(col4, 0),
0.5*nvl2(col1, 1, 0) + 1.0*nvl2(col2, 1, 0) + 0.5*nvl2(col3, 1, 0) + 1.0*nvl2(col4, 1, 0)
)
通常,我更喜欢 coalesce()
而不是 nvl()
。但是 nvl()
与 nvl2()
.
一起使用时似乎是合理的
Oracle AVG()函数可以用来达到你的目的。可以查看 Oracle Docs 以获取有关用法的更多信息。 AVG() 函数忽略 NULL 值。例如,2、4、NULL的平均值为(2 + 4) /2 = 3。希望对你有帮助。
我们有table喜欢
现在我们必须根据权重计算col1,col2,col3,col4的平均值分别为0.5,1.0,0.5,1.0
所以公式看起来像 ((col1*0.5)+(col2*1)+(col3*0.5)+(col4*1))/(0.5+1+0.5+1)
但如果任何列的值为空,则不应在分母中考虑
例如,第 2 行的平均公式应为
((0.398160315*0.5)+(nvl(col2,0)*1)+(0*0.5)+(nvl(col4,0)*1))/(0.5+0.5) =0.199080161
在 sql 中计算 我可以通过 nvl(col1,0) 处理分子中的 null 但我该如何处理分母
您可以使用 nvl2()
:
(0.5*nvl(col1, 0) + 1.0*nvl(col2, 0) + 0.5*nvl(col3, 0) + 1.0*nvl(col4, 0),
0.5*nvl2(col1, 1, 0) + 1.0*nvl2(col2, 1, 0) + 0.5*nvl2(col3, 1, 0) + 1.0*nvl2(col4, 1, 0)
)
通常,我更喜欢 coalesce()
而不是 nvl()
。但是 nvl()
与 nvl2()
.
Oracle AVG()函数可以用来达到你的目的。可以查看 Oracle Docs 以获取有关用法的更多信息。 AVG() 函数忽略 NULL 值。例如,2、4、NULL的平均值为(2 + 4) /2 = 3。希望对你有帮助。