2012-02-22 55 views
5

我有一個包含下列數據的表:計算平衡與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 

是否有可能有這樣做一個查詢,而不使用觸發器或存儲過程?

回答

14

簡短的回答,是的

較長的答案,你可以使用一個變量來吻合起來,因爲它迭代下來的行,即

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是一致的,否則天平將根據返回的行的順序而變化。如果你想,然後命令它回到前面,例如,你可以使用它作爲一個子查詢作爲再查詢外層涉及這樣的計算值確保平衡仍然正確即

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 
+0

如何與分頁,我覺得這個查詢不會運作良好,餘額將不順利 – 2016-11-27 12:25:50

+0

@PutraLZendrato我怕我不明白的問題 – 2016-11-29 10:20:34

+1

您好西蒙,我的意思是,如何在數據行很大,例如,我們有100個數據,但不會在一個頁面中加載。所以,我們分成2頁(分頁工作)。我認爲運行平衡不起作用。 – 2016-11-30 13:00:43

3

最簡單的答案會是:

SELECT `ID`, 
     `In`, 
     `Out`, 
     @running_bal := @running_bal + (`In` - `Out`) as `Balance` 
FROM tableName, (SELECT @running_bal := 0) tempName 
0

一個簡單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;