MYSQL中每行的平均值

时间:2017-08-24 12:06:45

标签: mysql count sum average

我想问你们如何计算下面结果的平均值:

我的代码如下:

SELECT `milestone_id`, `status`, sum(value), 
    CASE WHEN (status !='done') THEN (value ='0') ELSE sum(value) END as val 
FROM project_has_tasks 
WHERE project_id='56' 
AND milestone_id !=0 
GROUP BY milestone_id ASC

结果:

milestone_id | status | sum(value) | val |
121            done     81           81
122            undone   25           0
123            done     64           64
124            done     23           23

我想要做的是为每行设置一个平均数(平均值),因此结果应如下所示:

milestone_id | status | sum(value) | val | avg |
121            done     81           81    81
122            undone   25           0     40,5
123            done     64           64    48,3
124            done     23           23    42

等等 问题 - 如何实现上述结果?

PS:
The average for row 121 is from 81/1 = 81
The average for row 122 is from (81+0)/2 = 40,5
The average for row 123 is from (81+0+64)/3 = 48,3
The average for row 124 is from (81+0+64+23)/4 = 42

2 个答案:

答案 0 :(得分:0)

简介

您需要的是计算一个平均值。

这可以通过修改计算运行总和的方法轻松完成:

请参阅:https://stackoverflow.com/a/1290936/1688441

实施例

创建视图:

create view temp as 
SELECT `milestone_id`, `status`, sum(value), 
    CASE WHEN (status !='done') THEN (value ='0') ELSE sum(value) END as val 
FROM project_has_tasks 
WHERE project_id='56' 
AND milestone_id !=0 
GROUP BY milestone_id ASC

运行以下代码:

SET @runtot:=0;
SET @runcount:=0;
SELECT
  id,
  val,
  (@runtot := @runtot + val) AS runTotal,
  (@runcount := @runcount + 1) AS runCount,
  (@runtot / @runcount) AS runCount
FROM
  temp;

进行测试

由于我们没有您的数据库和表格,因此可以使用下表而不是视图进行测试:

create table temp(id int, val  int);

insert into temp(id, val) values (121, 81);
insert into temp(id, val) values (122, 0);
insert into temp(id, val) values (123, 64);
insert into temp(id, val) values (124, 23);

答案 1 :(得分:0)

这是我第一次发帖,所以请原谅我,如果我遗漏了任何重要的事情。我之前在MySQL中使用@变量实现了类似的功能。希望它会对你有所帮助。我使用DB小提琴测试了这个,因为我不知道你的数据结构如何,我不得不简化一下。这是我创建的示例表。

CREATE TABLE project_has_tasks (`milestone_id` int(6), `status` varchar(100), `value` int(6));

INSERT INTO project_has_tasks (`milestone_id`, `status`, `value`) VALUES (1, 'done', 81);
INSERT INTO project_has_tasks (`milestone_id`, `status`, `value`) VALUES (2, 'undone', 24);
INSERT INTO project_has_tasks (`milestone_id`, `status`, `value`) VALUES (3, 'done', 64);
INSERT INTO project_has_tasks (`milestone_id`, `status`, `value`) VALUES (4, 'done', 23);

以下是我提出的用于生成滚动平均值的查询。

SELECT milestone_id
       , Status
       , value
       , CASE WHEN (status != 'done') 
              THEN 0 
              ELSE value END AS val
       , (@v_total + CASE WHEN (status != 'done') 
                          THEN 0 
                          ELSE value END) / @v_count AS avg
       , @v_total := @v_total + CASE WHEN (status !='done') 
                                     THEN 0 
                                     ELSE value END
       , @v_count := @v_count + 1
  FROM project_has_tasks, (SELECT @v_total := 0, @v_count := 1) vars;

结果:

milestone_id | status | value | val | avg    | @v_total... | @v_count...
1            | done   |  81   | 81  | 81     |   81        |  2
2            | undone |  24   |  0  | 40.5   |   81        |  3
3            | done   |  64   | 64  | 48.3...|  145        |  4
4            | done   |  23   | 23  | 42     |  168        |  5