[英]Calculate balance with mysql
我有一個包含以下數據的表:
ID In Out
1 100.00 0.00
2 10.00 0.00
3 0.00 70.00
4 5.00 0.00
5 0.00 60.00
6 20.00 0.00
現在,我需要一個查詢,該查詢給出以下結果:
ID In Out Balance
1 100.00 0.00 100.00
2 10.00 0.00 110.00
3 0.00 70.00 40.00
4 5.00 0.00 45.00
5 0.00 60.00 -15.00
6 20.00 0.00 5.00
是否可以通過一個查詢而不使用觸發器或存儲過程來做到這一點?
簡短的回答,是的
更長的答案是,您可以使用變量在向下迭代行時對其進行計數,即
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
, (SELECT @Balance := 0) AS variableInit
確保@Balance在開始之前被初始化為0。 然后將每一行的@Balance設置為@Balance + In - Out
,然后輸出計算出的值。
同樣值得確定的是ORDER是一致的,否則Balance會根據返回行的順序而有所不同。 例如,如果您想將其重新排序,則可以將其用作子查詢,因為外部查詢將處理計算的值,從而確保余額保持正確,即
SELECT
`balanceCalculation`.`ID`,
`balanceCalculation`.`In`,
`balanceCalculation`.`Out`,
`balanceCalculation`.`Balance`
FROM (
SELECT
`table`.`ID`,
`table`.`In`,
`table`.`Out`,
@Balance := @Balance + `table`.`In` - `table`.`Out` AS `Balance`
FROM `table`, (SELECT @Balance := 0) AS variableInit
ORDER BY `table`.`ID` ASC
) AS `balanceCalculation`
ORDER BY `balanceCalculation`.`ID` DESC
最簡單的答案是:
SELECT `ID`,
`In`,
`Out`,
@running_bal := @running_bal + (`In` - `Out`) as `Balance`
FROM tableName, (SELECT @running_bal := 0) tempName
一個簡單的LEFT JOIN
就足夠了:
SELECT t.ID, t.In, t.Out, (SUM(t2.In) - SUM(t2.Out)) Balance
FROM mytable t
LEFT JOIN mytable t2 ON b2.ID <= b.ID
GROUP BY b.ID
或子查詢(事實證明它快大約兩倍)
SELECT t.ID, t.In, t.Out,
(SELECT SUM(t2.In) - SUM(t2.Out) FROM mytable t2 WHERE t2.ID <= t.ID) Balance
FROM mytable t;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.