假设我们有以下数据表:
+----+-------+-------+
| id | group | value |
+----+-------+-------+
| 1 | A | 10 |
| 2 | A | 20 |
| 3 | B | 15 |
| 4 | B | 25 |
| 5 | B | 30 |
+----+-------+-------+
现在想计算每个组内的累计值,我们可以使用MySQL的变量来实现:
SELECT id, group, value, @sum := IF(@group = group, @sum + value, value) AS sum, @group := group
FROM table1, (SELECT @sum := 0, @group := '') AS t
ORDER BY group, id;
执行结果:
+----+-------+-------+-----+------------+
| id | group | value | sum | @group := g |
+----+-------+-------+-----+------------+
| 1 | A | 10 | 10 | A |
| 2 | A | 20 | 30 | A |
| 3 | B | 15 | 15 | B |
| 4 | B | 25 | 40 | B |
| 5 | B | 30 | 70 | B |
+----+-------+-------+-----+------------+
这里我们使用了一个变量 @sum 来保存累计值,并且用 IF 函数来判断当前行是否属于同一组。如果是的话,@sum 的值加上当前行的 value 值,否则用当前行的 value 值来更新 @sum 。
需要注意的是,这个查询的结果默认情况下是不会返回 @group 的值的,所以我们需要使用一个额外的 @group 变量来记录当前组的值。
上一篇:按组计算变量得分改变的次数