我正在尝试在将显示在交易列表中的表格中获取支出的动态余额。左边是每笔支出的总和,右边是运行总计(累计余额)。
这是我的查询:
SELECT *, SUM(payment_sum) as total, @running_total := @running_total
+ payment_sum AS cumulative_sum FROM payments JOIN
(SELECT @running_total := 0)t WHERE id=?
GROUP BY source, report_date;
payment_sum 和 cumulative_sum(运行总计)是正确的,除非我按来源和报告日期分组。那么,payment_sum 是正确的,但运行总计不是。我需要按来源和报告日期分组,因为同一来源的付款可能发生在同一日期,因此我想将同一来源的所有付款分组在一起,以免显示两次。这会导致运行总计出现错误的余额。它似乎只合计了第一组来源。
没有源分组的输出(正确平衡):
Source date payout balance
Google 10/18/18 $5.00 $ 5.00
Google 10/18/18 $5.00 $10.00
Amazon 10/18/18 $2.50 $12.50
Amazon 10/18/18 $2.50 $15.00
WebStore 10/18/18 $2.00 $17.00
源分组的输出(不正确的平衡):
Source date payout balance
Google 10/18/18 $10.00 $ 5.00
Amazon 10/18/18 $ 5.00 $ 7.50
WebStore 10/18/18 $ 2.00 $ 9.50
期望的输出:(源,report_date 分组)
Source date payout balance
Google 10/18/18 $10.00 $10.00
Amazon 10/18/18 $ 5.00 $15.00
WebStore 10/18/18 $ 2.00 $17.00
关于如何更好地格式化我的查询以获得所需结果的任何想法?
最佳答案
尝试在 Derived Table 中使用 group by
操作的结果集,然后计算运行余额。
另外,请注意我已经做了正确的 Aliasing为了代码清晰(可读性),并避免歧义操作。
尝试以下操作:
SELECT dt.*,
@running_total := @running_total + dt.total AS cumulative_sum
FROM (
SELECT t1.*,
SUM(t1.payment_sum) as total
FROM payments AS t1
WHERE t1.id = ?
GROUP BY t1.source, t1.report_date
) AS dt
CROSS JOIN (SELECT @running_total := 0) AS t2
关于php - 在 MySql 中使用 group by 运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52602770/