php 中的自定义累计总和
Custom cumulative sum in php
我在 php mysql.
的累积总和上取得了成功
+---+---------+
| 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|
+---+---------+--------+
但我期待:
+---+---------+--------+
| id| SomeNumt| SUM|
+---+---------+--------+
| 1| 10| 10|
| 2| 12| 22|
| 4| 15| 37| -- 10+22+15
| 5| 23| 60| -- 10+22+15+23
+---+---------+--------+
如何修复?
您需要对 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
如果您使用的是 MySQL 8+,则应按照@GordonLinoff 的回答中所述使用 window 函数。
如果你想要累加和使用window函数:
SELECT t.id, t.SomeNumt,
SUM(t2.SomeNumt) OVER (ORDER BY t.id) AS SUM
FROM t
ORDER BY t.id;
如果您添加一个 WHERE
子句,那么这应该会执行您想要的操作。
我在 php mysql.
的累积总和上取得了成功+---+---------+
| 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|
+---+---------+--------+
但我期待:
+---+---------+--------+
| id| SomeNumt| SUM|
+---+---------+--------+
| 1| 10| 10|
| 2| 12| 22|
| 4| 15| 37| -- 10+22+15
| 5| 23| 60| -- 10+22+15+23
+---+---------+--------+
如何修复?
您需要对 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
如果您使用的是 MySQL 8+,则应按照@GordonLinoff 的回答中所述使用 window 函数。
如果你想要累加和使用window函数:
SELECT t.id, t.SomeNumt,
SUM(t2.SomeNumt) OVER (ORDER BY t.id) AS SUM
FROM t
ORDER BY t.id;
如果您添加一个 WHERE
子句,那么这应该会执行您想要的操作。