2012-05-27 38 views
0

我正在通過phpmyadmin運行MySql數據庫,並且正在構建查詢以總計一些值。正在運行重新啓動的查詢

在EXCEL式看起來像這樣= IF(AND(P6 = P5,B6 = B5),SUM(H5 + F6),F6)

即式被放入H柱

P列是類標識符。 B欄是他們的註冊號碼。 H列是他們的總分。 F列是其條目的分值。

它在excel中很好用。但是在SQL的語法中遇到一些麻煩。

我知道,首先我需要對文件進行排序,以便所有內容都按照正確的順序排列,並得到它。但從那時起,我無能爲力。

如果我的excel代碼需要更深入的解釋,我可以做到這一點,如果有幫助。

回答

1

據我知道你需要一些「分區」或行運行總計。看起來在MySql中,你需要對變量進行一些「黑客行爲」,因爲分析函數在這個數據庫中不可用。

以下查詢將做到這一點。它使用三個變量 - @rollingsum到F列的存儲和,@prevP和@prevB變量來存儲B和P列)的先前值

SELECT s.p, s.b, s.f, s.rollingSum FROM 
(
SELECT p, 
     b, 
     f, 
     IF([email protected] AND [email protected], 
     @rollingsum := @rollingsum + f, 
     @rollingsum := f) as rollingSum, 
     @prevP := p, 
     @prevB := b 
FROM  test_table p, (SELECT @rollingsum := 0, @prevP := '', @prevB := '') r 
ORDER BY p,b) s 

實施例:

源數據:

P B F 
1 1 10 
1 1 10 
1 2 10 
1 2 10 
1 2 10 
2 2 10 
2 2 10 
2 2 10 

結果以上查詢(rollingsum列是您的H列 - 總積分在Excel):

P B F ROLLINGSUM 
1 1 10 10 
1 1 10 20 
1 2 10 10 
1 2 10 20 
1 2 10 30 
2 2 10 10 
2 2 10 20 
2 2 10 30 
+0

看起來很完美!我離開我的電腦,但今晚我回到家時,我會放棄它。它看起來正是我所需要的。謝謝! –

+0

好吧,離得更近。我需要改變的唯一事情是我認爲ORDER BY需要成爲運行的第一件事情之一。因爲這些文件並不總是按正確的順序。我需要它將rollingsum值設置爲總點列。下面是我現在看到的值: –

+0

SELECT Test.Class_Subset,Test.RegNum,Test.Points,Test.Total_Points,Test.rollingsum,Test.Date_Earned FROM( SELECT Class_Subset,Total_Points,RegNum,Points, Date_Earned,IF(Class_Subset = @prevSub AND RegNum = @prevNum,@rollingsum:= @rollingsum +'Points',@rollingsum:''Points')AS rollingSum,@prevSub:= Class_Subset,@prevNum:= RegNum FROM測試( SELECT @rollingsum:= 0,@prevSub:= '',@prevNum:= '' )R ORDER BY REGNUM,Class_Subset,Date_Earned,Total_Points )測試 –

0

你沒有給我們太多的細節對你的表結構,所以我假設你有記錄與SOME_ID = 5和SOME_ID = 6 有了這些數據,一個可能的SQL語句是:

select 
    (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as B_PREVIOUS, 
    (select T1.F from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as F_PREVIOUS, 
    (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as H_PREVIOUS, 
    (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) as P_PREVIOUS, 
    B as B_CURRENT, F as F_CURRENT, H as H_CURRENT, P as P_CURRENT, 
    case when 
     (select T1.B from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = B 
     and 
     (select T1.P from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) = P then 
      (select T1.H from SOME_TABLE T1 where T1.SOME_ID = :PREVIOUS_ID) + F 
    else 
      F 
    end as RESULT 
from SOME_TABLE 
where SOME_ID = :CURRENT_ID 

當然,唯一需要的返回列是RESULT。我只爲了調試目的而返回其他對象。

希望這可以幫助你!

編輯:更新,以反映@Ben地注意到性能下降是由於反覆搜索當前記錄

+0

她e是我的文件的截圖:http://nadacforum.com/Points.png我認爲上述方法可行。但唯一的問題是我需要一些可以在沒有我輸入的情況下查看RegNum的東西。這些大文件長達近百萬條記錄。 –

+0

嗯,我不確定我是否正確理解你的問題。如果您需要處理一條記錄,以前一條記錄作爲參考,也許我現在更新的答案會給您預期的結果。無論如何,此解決方案一次只能爲一個ID工作。如果您需要動態查找以前的ID,您可以添加「where SOME_ID =(從SOME_TABLE中選擇max(ID),其中ID <:CURRENT_ID),或者類似的東西 – jfoliveira

+0

您真的建議OP執行8次索引掃描嗎?這看起來有點過分嗎? – Ben

相關問題