2014-03-29 62 views
0

真的無法解釋我的問題用語言,而是用一個例子,我可以清楚地顯示:Mysql的遞歸從其減去再乘以值

我有這樣的一個表:

id num val 
0  3  10 
1  5  12 
2  7  12 
3  11 15 

而且我想遍歷所有行,並計算「num」的增加量,並將該差值與「val」值相乘。當我計算所有這些時,我想將這些結果加在一起。

這是數學公式,我想在桌子上運行:

Result = (3-0)*10 + (5-3)*12 + (7-5)*12 + (11-7)*15 
138 = Result 

謝謝。

回答

2

你可以使用mysql變量,但是你仍然會得到每個條目的一條記錄。

select 
     @lastTotal := @lastTotal + ((yt.num - @lastNum) * yt.val) thisLineTotal, 
     @lastNum := yt.num as saveForNextRow, 
     yt.id 
    from 
     yourTable yt, 
     (select @lastTotal := 0, 
       @lastNum := 0) sqlvars 
    order by 
     id 

這應該給你什麼你想確認計算,以每個記錄的基礎。

現在,爲了得到一個記錄和一列結果,你可以用它如

select 
     pq.thisLineTotal 
    from 
     (above entire query) as pq 
    order by 
     pq.id DESC 
    limit 1 
+0

我在想: 選擇 總和((a.num - ifnull(b.num,0))* a.val)作爲結果 from tt a left join tt b on b.id =(a.id - 1); 但是,這個假設ID總是增加一。我喜歡連接中的變量技巧。 –

+0

謝謝,它正在工作,但我意識到我已經從問題中排除了我的問題的關鍵部分,請問您可以在這裏查看我修改的問題嗎? :[鏈接](http://stackoverflow.com/questions/22726266/mysql-recursive-substracting-and-multiplying-grouped-values) – Sevron

0

這將會給你的整體。請確保您希望以訂單 - 我已經按id訂購

SET @runtot:=0; 
SET @prevval:=0; 

select max(rt) as total FROM (
SELECT 
    q.val, 
    q.num, 
    (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt, 
    (@prevval := q.num) AS pv 
FROM thetable q 
ORDER by ID) tot 

如果你想看到計算的細節,離開了外選擇像這樣:

SET @runtot:=0; 
SET @prevval:=0; 

SELECT 
    q.val, 
    q.num, 
    (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt, 
    (@prevval := q.num) AS pv 
FROM thetable q 
ORDER by ID 

如果有可能對你的列值有負數,使用max(rt)將不適用於總數。然後,您應該使用:

SET @runtot:=0; 
SET @prevval:=0; 

select @runtot as total FROM (
SELECT 
    q.val, 
    q.num, 
    (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt, 
    (@prevval := q.num) AS pv 
    FROM thetable q 
ORDER by ID) tot LIMIT 1 
0

假設ID是爲您的樣本數據表明連續的,剛剛加入該表本身:

select sum((t1.num-ifnull(t2.num,0))*t1.val) YourValue 
from YourTable t1 
    left join YourTable t2 
    on t2.id = t1.id - 1; 

http://www.sqlfiddle.com/#!2/40b9f/12