【问题标题】:how to select data from two table and sum the balance from debit and credit columns (php)如何从两个表中选择数据并将借方和贷方列中的余额相加(php)
【发布时间】:2019-03-01 11:51:32
【问题描述】:

我有两张桌子

信用表

id     date      credit
1    4-1-2019     300
2   10-1-2019     500
3   10-2-2019     300

借记表

id     date      debit
1    2-1-2019     400
2   6-1-2019     600
3   2-2-2019     300

我想要一个表格来合并这些数据并显示余额,按日期排序

类似的东西

id     date      debit  credit  balance
1    2-1-2019     400            400
1    4-1-2019             300    100
2    6-1-2019     600            700
2   10-1-2019             500    200
3    2-2-2019     300            500
3   10-2-2019             300    200

更新

我正在使用@Gordon Linoff 代码

select b.*,
   (@b := @b + coalesce(debit, 0) - coalesce(credit, 0)) as balance from (select id, date, debit, credit
  from ((select id, date, debit, "0" as credit
         from debit
        ) union all
        (select id, date, "0" as debit, credit
         from credit 
        )
       ) b
  order by date
 ) b CROSS join
 (select @b := 0) params

它工作但我得到这样的输出table

id     date      debit  credit  balance
1    2-1-2019     400            400
2    6-1-2019     600            1000
3    2-2-2019     300            1300
1    4-1-2019             300    1000
2   10-1-2019             500    500
3   10-2-2019             300    200

我需要在这里按日期对整个数据进行排序,因为您可以看到首先排序的借方表数据,然后是贷方表的数据

【问题讨论】:

  • 你应该解释一下你到目前为止所尝试的,这样其他人可能会更快地发现你的问题并给你一个更好的答案。

标签: php mysql


【解决方案1】:

您可以使用union all 组合表格。在 MySQL 8+ 中,您可以使用累积和计算最后一列:

select id, date, debit, credit,
       sum( coalesce(debit, 0) - coalesce(credit, 0) ) over (order by date) as balance
from ((select id, date, debit, null as credit
       from debit
      ) union all
      (select id, date, null as debit, credit
       from credit 
      )
     ) b
order by date;

在早期版本中,您可以使用变量进行计算:

select b.*,
       (@b := @b + coalesce(debit, 0) - coalesce(credit, 0)) as balance
from (select id, date, debit, credit
      from ((select id, date, debit, null as credit
             from debit
            ) union all
            (select id, date, null as debit, credit
             from credit 
            )
           ) b
      order by date
     ) b cross join
     (select @b := 0) params
order by date;

【讨论】:

  • 我有些不明白。不应该是@b := @b + coalesce(吗?
  • @bato3 YES 正确终于奏效了。谢谢,两个人:)你们让我很开心:)
  • 这个代码只排序一个表值,即它排序贷方表日期然后借方表日期。我只需要按日期对整个表进行排序
  • @SharoonCk 。 . .然后只需order by date。从您的问题中不清楚排序键是什么。我做了更改,只按日期订购。
  • 是的,我也更改为日期。但它以一种方式显示,首先按日期数据排序的借方表,然后按日期数据排序的贷方表。我需要数据,就像我提到的 qstion 一样。即按日期排序的整个数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多