我真的很感谢你的帮助。
情况是我有这两个表:
表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
但是如何达到理想的结果是超出我的。
提前致谢!
答案 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`;