平均来自多列的数据库值,绕过零/ null

时间:2017-06-13 08:34:10

标签: mysql sql

我正在尝试根据几个不同列中的值保存平均值,但有些行为空,因此需要将它们替换为零。此外,在这一点上,我需要将平均值计入零,以便下面的示例将平均值保存为“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

2 个答案:

答案 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 |
+------------+---------------------+