自定义累积总和

时间:2020-08-08 03:51:53

标签: mysql sql group-by inner-join cumulative-sum

我已经在php mysql中获得了成功的总和。

ScenarioPage.cs

输出:

+---+---------+
| id| SomeNumt|
+---+---------+
|  1|       10|
|  2|       12|
|  3|        3|
|  4|       15|
|  5|       23|
+---+---------+

SELECT t1.id,
       t1.SomeNumt,
       SUM(t2.SomeNumt) AS SUM
FROM t t1
INNER JOIN t t2 ON t1.id >= t2.id
GROUP BY t1.id,
         t1.SomeNumt
ORDER BY t1.id

现在,当我自定义查询(+---+---------+--------+ | id| SomeNumt| SUM| +---+---------+--------+ | 1| 10| 10| | 2| 12| 22| | 3| 3| 25| | 4| 15| 40| | 5| 23| 63| +---+---------+--------+ )时出现一个小问题

WHERE t1.SomeNumt>3

输出错误

...
INNER JOIN t t2 ON t1.id >= t2.id
WHERE t1.SomeNumt>3
...

但是我期待着:

+---+---------+--------+
| id| SomeNumt|     SUM|
+---+---------+--------+
|  1|       10|      10|
|  2|       12|      22|
|  4|       15|      40|
|  5|       23|      63|
+---+---------+--------+

如何解决?

2 个答案:

答案 0 :(得分:0)

您需要对t2应用相同的条件:

SELECT t1.id,
       t1.SomeNumt,
       SUM(t2.SomeNumt) AS SUM
FROM t t1
INNER JOIN t t2 ON t1.id >= t2.id
WHERE t1.SomeNumt > 3 AND t2.SomeNumt > 3
GROUP BY t1.id,
         t1.SomeNumt
ORDER BY t1.id

或者,您可以在子查询中应用条件:

SELECT t1.id,
       t1.SomeNumt,
       SUM(t2.SomeNumt) AS SUM
FROM (SELECT * FROM t WHERE SomeNumt > 3) t1
INNER JOIN (SELECT * FROM t WHERE SomeNumt > 3) t2 ON t1.id >= t2.id
GROUP BY t1.id,
         t1.SomeNumt
ORDER BY t1.id

输出(对于两个查询):

id  SomeNumt    SUM
1   10          10
2   12          22
4   15          37
5   23          60

Demo on dbfiddle

如果您使用的是MySQL 8+,则应使用@GordonLinoff的答案中所述的窗口函数。

答案 1 :(得分:0)

如果要累积总和,请使用窗口函数:

SELECT t.id, t.SomeNumt,
       SUM(t2.SomeNumt) OVER (ORDER BY t.id) AS SUM
FROM t
ORDER BY t.id;

如果添加一个WHERE子句,则应该执行您想要的操作。