两个表上的MySQL联合,累计值又称“银行对帐单”

时间:2012-08-03 20:08:51

标签: mysql

我真的很感谢你的帮助。

情况是我有这两个表:

表1:借方。例如:

    date       item   value_debits
    2012-08-01 item1  10
    2012-08-03 item2  15

表2:学分。例如:

    date       item   value_credits
    2012-07-31 item3  20
    2012-08-02 item4  30  

期望的结果:

    date       item   value  balance
    2012-07-31 item3  20     20
    2012-08-01 item1  (10)   10
    2012-08-02 item4  30     40
    2012-08-03 item3  (15)   25

我可以轻松地分别计算每个表的累积值:

set @cumulative :=0;
select date, item, value_debits, @cumulative := @cumulative + value_debits AS "Cumulated" 
from debits
order by date DESC

按照约会这两个表进行联合和排序并不太难:

    date       item   value
    2012-07-31 item3  20
    2012-08-01 item1  10
    2012-08-02 item4  30
    2012-08-03 item3  15

但是如何达到理想的结果是超出我的。

提前致谢!

2 个答案:

答案 0 :(得分:1)

您可以使用:

SELECT     a.date,
           a.item,
           CASE 
               WHEN a.value < 0 THEN CONCAT('(', a.value, ')') 
               ELSE a.value
           END AS value,
           @bal:=@bal+a.value AS balance
FROM       (
           SELECT date, item, value_debits*-1 AS value FROM debits
           UNION ALL
           SELECT date, item, value_credits FROM credits
           ) a
CROSS JOIN (SELECT @bal:=0) bal_init
ORDER BY   a.date

看看这个SQLFiddle Demo

答案 1 :(得分:0)

这是我对您的解决方案无效的尝试。如果时间到了,我会尝试找出更有效的方法。但是,它确实有效。

SELECT U.`date`, U.item, U.value, 
  (SELECT SUM(U2.value) FROM 
     (SELECT `date`,item,-value_debits as value
      FROM debits
      UNION ALL
      SELECT `date`,item,value_credits as value
      FROM credits
     ) AS U2
   WHERE `date` <= U.date) 
   AS balance 
FROM 
  (SELECT `date`,item,-value_debits as value
   FROM debits
   UNION ALL
   SELECT `date`,item,value_credits as value
   FROM credits
  ) AS U
ORDER BY `date`

如果信用卡和借记卡在同一张表中,这会稍微容易一些。

更好的解决方案

SET @total=0;
SELECT U.`date`, 
       U.item, 
       CASE WHEN U.value<0 
          THEN CONCAT('(', -U.value, ')') 
          ELSE U.value
       END as value, 
       @total:=@total+value AS balance
FROM (SELECT `date`,item,-value_debits as value
      FROM debits
      UNION ALL
      SELECT `date`,item,value_credits as value
      FROM credits
     ) AS U
ORDER BY U.`date`;