我试图找到有一种有效的方法来执行查询,该查询可以忽略任何列的值为0或空的数据行
我当前的查询如下所示:
$query = "SELECT AVG(concept1) AS c1, AVG(concept2) AS c2, AVG(concept3) AS c3, AVG(concept4) AS c4, AVG(concept5) AS c5, AVG(concept6) AS c6 FROM KeyPad";
Run Code Online (Sandbox Code Playgroud)
现在我不想计算行数,同时平均任何列数据为0或null.
例如.
-----------------------------------------
|concept1 | concept2 | concept3 | ...
-----------------------------------------
| 1.2 | 3.2 | 0 | ...
| 2.4 | 4.1 | 2.1 | ...
| 3.2 | 5.1 | 2.2 | ...
| 4.3 | 3.2 | 5.3 | ...
| 1.2 | 0 | 3.2 | ...
------------------------------------------
Run Code Online (Sandbox Code Playgroud)
当我运行查询时,我只想使用行2,3,4中的数据生成平均值,并忽略第1行和第5行中的所有数据.
我读过我可以使用像COALESCE这样的东西,但不确定它是否可以用于平均值.
我应该探索哪些方向的建议?
我可能没有正确解释.当我说忽略行时,我的意思是如果行中的一个项目是0,我想忽略行中的所有其他项目,同时平均这些列.
因此在上面的示例表中,Column1的平均值为:(2.4 + 3.2 + 4.3)/ 3,因为第3列中的第一行为0,第2列中的最后一行也为0.因此其他列也需要忽略这些在计算平均值时有两行.
我希望这能澄清我的问题.
您可以这样使用,它不会考虑具有值的行0并且AVG本身会排除null值
SELECT AVG(NULLIF(concept4, 0)) FROM KeyPad;
Run Code Online (Sandbox Code Playgroud)
或使用案例(示例演示链接)
SELECT AVG(case
when concept1 = 0 then null
else concept1
end) as c1
FROM KeyPad
Run Code Online (Sandbox Code Playgroud)
所以你的完整查询:
SELECT AVG(NULLIF(concept1,0)) AS c1,
AVG(NULLIF(concept2,0)) AS c2,
AVG(NULLIF(concept3,0)) AS c3,
AVG(NULLIF(concept4,0)) AS c4,
AVG(NULLIF(concept5,0)) AS c5,
AVG(NULLIF(concept6,0)) AS c6
FROM KeyPad
Run Code Online (Sandbox Code Playgroud)
如果您愿意,可以WHERE根据您的要求添加类似的条件:
SELECT AVG(concept1) AS c1
FROM KeyPad
WHERE concept1 > 0
Run Code Online (Sandbox Code Playgroud)
注意:如果错误地将多个列分组,则条件可能会更改您所需的输出。如果您想检查单个字段,请使用
NULLIF或CASE