【问题标题】:MySQL Opening closing balance with date range带有日期范围的 MySQL 期初期末余额
【发布时间】:2020-04-27 05:13:06
【问题描述】:

我的 MySQL 数据库中有一个表 transactions,有 50K 条记录。数据如下所示。

trx_date    bill        due
2020-03-01  100.00      10.00
2020-03-02   50.00      20.00   
2020-03-02  100.00       0.00  
2020-03-03  200.00      30.00  
2020-03-04  100.00      10.00
...
...

我的目标是显示带有查询参数from_dateto_date的查询结果

从开桌之日起为0,计算为

opening(+) bill (+) due (-) closing = ( opening+bill ) - due

trx_date    opening     bill        due     closing
2020-03-01  0           100.00      10.00    90.00
2020-03-02  90.00       50.00       20.00   120.00     
2020-03-02  120.0       100.00       0.00   220.00
2020-03-03  220.00      200.00      20.00   400.00  
2020-03-04  400.00      110.00      10.00   500.00
....
....

我不知道为我选择的 from_date opening 获取上一个日期 closing 的最佳方式是什么。

from_date=2020-03-03to_date=2020-03-04

trx_date    opening     bill        due     closing    
2020-03-03  220.00      200.00      20.00   400.00  
2020-03-04  400.00      110.00      10.00   500.00

我的意思是如何从之前的结果中打开220.00?从之前的结果中得到 220.00 可能有数千条记录,那么最佳实践是什么?

【问题讨论】:

  • 你是如何计算openingclosing的?还是已经在表格中了?
  • 请提供您已经尝试过的SQL语句。
  • 最小日期 = 开 0 开 (+) 账单 (+) 到期 (-) 关 = ( 开 + 账单 ) - 到期
  • 你的 MySQL 版本是多少?
  • @Akina MySQL 版本 5.7.24

标签: mysql sql


【解决方案1】:

您需要从第一个trx_date 开始计算所有openingclosing 值,然后按您感兴趣的日期过滤结果:

SELECT trx_date, opening, bill, due, closing
FROM (
  SELECT trx_date, 
         @balance AS opening,
         bill,
         due,
         @balance := @balance + bill - due AS closing
  FROM transactions
  CROSS JOIN (SELECT @balance := 0) ini
  ORDER BY trx_date
) tx
WHERE trx_date BETWEEN '2020-03-03' AND '2020-03-04'

输出:

trx_date    opening     bill    due     closing
2020-03-03  220         200     20      400
2020-03-04  400         110     10      500

Demo on dbfiddle

【讨论】:

  • 您的查询对我制作库存报告有很大帮助,但我遇到了一些问题。问题在于,对于每种产品和产品类型,期初库存应该是零尊重。你能帮帮我吗?
  • @Rudrakshya 如果您只使用应该给您想要的结果的子查询。如果没有,我建议你提出一个新问题。
【解决方案2】:

试试

SET @fromDate='2020-03-03', @toDate='2020-03-04';
SET @minDate = (SELECT MIN(trx_date) FROM transactions);
SET @previousDate=DATE_SUB(@fromDate,INTERVAL 1 DAY);

SELECT trx_date,@balance opening, bill, due, @balance := @balance + bill - due closing
FROM transactions, (SELECT @balance := (SELECT SUM(bill)-SUM(due) FROM transactions WHERE trx_date BETWEEN @minDate AND @previousDate)) variable
WHERE trx_date BETWEEN @fromDate AND @toDate ORDER BY trx_date;

【讨论】:

    【解决方案3】:

    正式地:

    SELECT @balance opening, bill, due, @balance := @balance + bill - due closing
    FROM source_table, (SELECT @balance := 0) variable
    /* ORDER BY trx_date */
    ;
    

    但显示的示例数据中没有唯一标准 - 因此结果不是确定性的。

    【讨论】:

    • 感谢您的回复。使用此查询,任何日期范围的期初余额始终以 0 开头。请阅读我的问题最后一部分
    • @Akashkhan 将variable 子查询中的起始余额从 0 更改为您需要的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多