MYSQL中按类别分组的每个财政年度的期初余额和期末余额之和

MYSQL中按类别分组的每个财政年度的期初余额和期末余额之和,mysql,sql,Mysql,Sql,我用了三天的时间试图解决这个问题,但都没有成功。我也在这个论坛上做了一些搜索,但也失败了。 这可能看起来像是重复的问题,但老实说,这与其他问题不同。 我的问题是如何获得每个财政年度的结存结转C/F和期末余额的总和,并根据每个日期范围(即财政年度)的贷款id进行分组? 上面的表模式和它的数据有我也读过这个线程,它只适用于单个用户 到目前为止,我已经尝试: SELECT loan_id, SUM(credit)-(SELECT SUM(a.debit) FROM transaction_t a

我用了三天的时间试图解决这个问题,但都没有成功。我也在这个论坛上做了一些搜索,但也失败了。
这可能看起来像是重复的问题,但老实说,这与其他问题不同。
我的问题是如何获得每个财政年度的结存结转C/F和期末余额的总和,并根据每个日期范围(即财政年度)的贷款id进行分组?


上面的表模式和它的数据有
我也读过这个线程,它只适用于单个用户

到目前为止,我已经尝试:

SELECT loan_id,

 SUM(credit)-(SELECT SUM(a.debit) FROM transaction_t a 
   WHERE a.transaction_date 
   BETWEEN '2019-01-01' AND '2020-12-31' AND a.loan_id = loan_id) AS OpeningBalance, 

sum(credit),sum(debit), 
(@OpeningBalance+SUM(credit))-SUM(debit) AS closing_balance  
FROM transaction_t tr
WHERE transaction_date BETWEEN DATE('2019-01-01') AND DATE('2020-12-31') 
GROUP BY loan_id
但是上面没有给出正确的结果,我如何得到这些结果?
A:查询2017-01-01和2018-12-31之间的日期

loan_id     opening_balance       sum(credit_amount)     sum(debit_amount)   closing_balance
1           0                     13,000.00                6,400.00           6,600.00 
2           0                     2,200.00                 2,500.00          -300
loan_id     opening_balance       sum(credit_amount)     sum(debit_amount)   closing_balance
1           6,600                     100.00               200.00            6,500.00 
2           -300                      1,800.00             500.00            1,000
B:查询2019-01-01和2020-12-31之间的日期

loan_id     opening_balance       sum(credit_amount)     sum(debit_amount)   closing_balance
1           0                     13,000.00                6,400.00           6,600.00 
2           0                     2,200.00                 2,500.00          -300
loan_id     opening_balance       sum(credit_amount)     sum(debit_amount)   closing_balance
1           6,600                     100.00               200.00            6,500.00 
2           -300                      1,800.00             500.00            1,000

您正在寻找条件聚合

关键是您需要从历史记录的开始扫描表,以便生成初始余额。然后您只需要调整条件和:

考虑:

SET @start_date = '2017-01-01';
SET @end_date = '2018-12-31';

SELECT
    loan_id,
    SUM(CASE WHEN transaction_date < @start_date THEN credit - debit ELSE 0 END) opening_balance,
    SUM(CASE WHEN transaction_date BETWEEN @start_date AND @end_date THEN credit ELSE 0 END) sum_credit,
    SUM(CASE WHEN transaction_date BETWEEN @start_date AND @end_date THEN debit ELSE 0 END) sum_debit,
    SUM(CASE WHEN transaction_date <= @end_date THEN credit - debit ELSE 0 END) closing_balance
FROM transaction_t
WHERE transaction_date <= @end_date
GROUP BY loan_id
以及:

NB:这是一个问得很好的问题,所以我们可以使用更多的

loan_id opening_balance sum_credit  sum_debit   closing_balance
1       6600            100         200         6500
2       -300            1800        500         1000