SQL 使用存储过程查询

SQL query using stored procedure

我在 MySQL 中有一个 table 三列,需要使用存储过程计算三列的每一行的平均值:

Id  |  One  |  Two  |  Three
----+-------+-------+-------
1   |  10   |  30   |  20
2   |  50   |  60   |  20
3   |  60   |  0    |  40

必须使用存储过程而不是普通查询来确定平均值。

我有这个 SQL 查询

select
    id, 
    (ifnull(one, 0) + ifnull(two, 0) + ifnull(three, 0)) /
        ((one is not null) + (two is not null) + (three is not null)) as average 
from table

我希望它看起来像这样,带有 MySQL 查询:

Id | Average
---+--------
1  | 20
2  | 43.3
3  | 50

也许不是最佳解决方案,但您可以使用:

select id, 
       SUM(coalesce(one,0)+coalesce(two,0)+coalesce(three,0)) /
       count(CASE WHEN one != 0 and one is not null  then 1 ELSE NULL END) 
       + count(CASE WHEN two != 0 and two is not null  then 1 ELSE NULL END) 
       + count(CASE WHEN three  != 0 and three is not null  then 1 ELSE NULL END )  as average 

from my_table
group by id;

Result:

id    average
1     20.0000
2     43.3333
3     50.0000
4     35.0000

Demo

此查询排除 Null0

coalesce

完整程序

DELIMITER//
CREATE PROCEDURE average()
BEGIN 

    select id, SUM(coalesce(one,0)+coalesce(two,0)+coalesce(three,0)) /(count(CASE WHEN one != 0 and one is not null  then 1 ELSE NULL END) + count(CASE WHEN two != 0 and two is not null  then 1 ELSE NULL END) + count(CASE WHEN three  != 0 and three is not null  then 1 ELSE NULL END))  as average from my_table group by id ;

END
DELIMITER ;