我正在尝试根据几个不同列中的值保存平均值,但有些行为空,因此需要将它们替换为零。此外,在这一点上,我需要将平均值计入零,以便下面的示例将平均值保存为“82.490”。所以它需要用零替换null,然后绕过平均值的任何零。
1CorrectAcc 2CorrectAcc 3CorrectAcc 4CorrectAcc 5CorrectAcc avg
90.345 67.890 89.234 0 0
这是一个伪查询
UPDATE staging
SET `avg` = (1CorrectAcc + 2CorrectAcc + 3CorrectAcc + 4CorrectAcc + 5CorrectAcc) / COUNT avoiding zeroes
答案 0 :(得分:1)
由于值不在列聚合函数中,因此无法使用
(
coalesce(col1, 0) +
coalesce(col2, 0) +
...
) / (
case when coalesce(col1, 0)=0 then 0 else 1 end +
case when coalesce(col2, 0)=0 then 0 else 1 end +
...
)
如果连续所有列都为0或null,则会引发除0错误,可以避免在where子句中添加以下条件来过滤这些行。
[where/and] not (
coalesce(col1, 0) = 0 and
coalesce(col2, 0) = 0 and
...
)
答案 1 :(得分:1)
规范您的架构:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,account_id INT NOT NULL
,value DECIMAL(7,3)
);
INSERT INTO my_table VALUES
(1,1,90.345),
(2,1,67.890),
(3,1,89.234),
(4,1,NULL);
SELECT * FROM my_table;
+----+------------+--------+
| id | account_id | value |
+----+------------+--------+
| 1 | 1 | 90.345 |
| 2 | 1 | 67.890 |
| 3 | 1 | 89.234 |
| 4 | 1 | NULL |
+----+------------+--------+
SELECT account_id, ROUND(AVG(value),3) FROM my_table GROUP BY account_id;
+------------+---------------------+
| account_id | ROUND(AVG(value),3) |
+------------+---------------------+
| 1 | 82.490 |
+------------+---------------------+