我想问你们如何计算下面结果的平均值:
我的代码如下:
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
答案 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