我正在从 mysql 表中获取一些事务数据,如下所示:
SELECT bill_no as Document_No, bill_date as Trans_Date, bill_amount as Amount, 0 as Balance
FROM bill_table
WHERE consumer_name = 'John'
UNION
SELECT receipt_no as Document_No, receipt_date as Trans_Date, -receipt_amount as Amount, 0 as Balance
FROM receipt_table
WHERE consumer_name = 'John'
ORDER BY Trans_Date
结果是这样的
+-----------+----------+------+-------+ |Document_No|Order_date|Amount|Balance| +-----------+----------+------+-------+ |BILL58788 |2010-08-09|493 | 0 | |BILL58789 |2010-08-10|789 | 0 | |REC_12379 |2010-08-11|-1282 | 0 | |BILL58788 |2010-08-12|1493 | 0 | |BILL58788 |2010-09-01|4930 | 0 | |REC_12380 |2010-10-02|-2000 | 0 | +-----------+----------+------+-------+
这为我提供了约翰的所有账单和收据详细信息。所有金额都在同一列中,帐单金额为正,收据金额为负。
在最后一列“余额”中,我想要像这样动态计算的连续金额总数:
+-----------+----------+------+-------+ |Document_No|Order_date|Amount|Balance| +-----------+----------+------+-------+ |BILL58788 |2010-08-09|493 | 493 | |BILL58789 |2010-08-10|789 | 1282 | |REC_12379 |2010-08-11|-1282 | 0 | |BILL58788 |2010-08-12|1493 | 1493 | |BILL58788 |2010-09-01|4930 | 6423 | |REC_12380 |2010-10-02|-2000 | 4423 | +-----------+----------+------+-------+
我知道我可以在获取数据后在 PHP 中完成此操作,但我想通过 mySQL 本身完成此操作。
这可能吗?请帮忙。 提前致谢。
最佳答案
在 MySQL 中,最简单的方法是使用变量:
select Document_No, bill_date, bill_amount,
(@balance := @balance + bill_amount) as balance
from ((SELECT bill_no as Document_No, bill_date as Trans_Date, bill_amount as Amount
FROM bill_table
WHERE consumer_name = 'John'
)
UNION ALL
(SELECT receipt_no as Document_No, receipt_date as Trans_Date, -receipt_amount as Amount
FROM receipt_table
WHERE consumer_name = 'John'
)
) t cross join
(select @balance := 0) const
ORDER BY Trans_Date;
关于mysql - 如何返回列中连续行与其他数据的差异 (mySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21071776/