php - 在 MySql 中使用 group by 运行总计

标签 php mysql pdo

我正在尝试在将显示在交易列表中的表格中获取支出的动态余额。左边是每笔支出的总和,右边是运行总计(累计余额)。

这是我的查询:

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/

相关文章:

php - 从 JSON 数据自动生成 MySQL 表和列

php - 在 MYSQL 和 PHP 变量中使用 BETWEEN 进行选择

php - 图片 MIME 类型和扩展名正确,但上传失败

mysql - 在 my.conf 中有自己的 [sections] 好吗?

javascript - 将动态网页存储为对象的最佳方式是什么?

具有 PDO 的基于 PHP 类的用户系统 - 在非对象上调用成员函数 prepare()

php - 要求(MySQL); PHP 错误

mysql - 连接两个 Select 语句

php - PDO 交互在类之间共享

php - PDO异常 “could not find driver”