[英]Conditional cumulative SUM in MySQL
我有下表:
+-----+-----------+----------+------------+------+
| key | idStudent | idCourse | hourCourse | mark |
+-----+-----------+----------+------------+------+
| 0 | 1 | 1 | 10 | 78 |
| 1 | 1 | 2 | 20 | 60 |
| 2 | 1 | 4 | 10 | 45 |
| 3 | 3 | 1 | 10 | 90 |
| 4 | 3 | 2 | 20 | 70 |
+-----+-----------+----------+------------+------+
使用简单的查询,我可以根据hourCourse
显示学生的加权平均值并mark
:
SELECT idStudent,
SUM( hourCourse * mark ) / SUM( hourCourse ) AS WeightedAvg
FROM `test`.`test`
GROUP BY idStudent;
+-----------+-------------+
| idStudent | WeightedAvg |
+-----------+-------------+
| 1 | 60.7500 |
| 3 | 76.6667 |
+-----------+-------------+
但现在我需要选择寄存器,直到每个学生的hourCourse
累积总和达到阈值。 例如,对于30 hourCourse
的阈值,只应考虑以下寄存器:
+-----+-----------+----------+------------+------+
| key | idStudent | idCourse | hourCourse | mark |
+-----+-----------+----------+------------+------+
| 0 | 1 | 1 | 10 | 78 |
| 1 | 1 | 2 | 20 | 60 |
| 3 | 3 | 1 | 10 | 90 |
| 4 | 3 | 2 | 20 | 70 |
+-----+-----------+----------+------------+------+
key
2没有被考虑在内,因为idStudent
1已经通过idCourse
1和2达到30 hourCourse
idCourse
。
最后,查询解决方案应该如下:
+-----------+-------------+
| idStudent | WeightedAvg |
+-----------+-------------+
| 1 | 66.0000 |
| 3 | 76.6667 |
+-----------+-------------+
有没有办法为此创建内联查询? 提前致谢。
编辑:选择课程时的标准是从最高到最低。 编辑:当hrCourse的累积总和小于30时,包括寄存器。例如,将包括两个20小时的寄存器(总和40),以下不是。
您可以在子查询中计算每个idStudent的累计总和,然后仅选择累积总和<= 30的结果:
select idStudent,
SUM( hourCourse * mark ) / SUM( hourCourse ) AS WeightedAvg
from
(
SELECT t.*,
case when @idStudent<>t.idStudent
then @cumSum:=hourCourse
else @cumSum:=@cumSum+hourCourse
end as cumSum,
@idStudent:=t.idStudent
FROM `test` t,
(select @idStudent:=0,@cumSum:=0) r
order by idStudent, `key`
) t
where t.cumSum <= 30
group by idStudent;
演示: http ://www.sqlfiddle.com/#!2 / f5d07 / 23
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.