2011-10-04 78 views
8

嗨有沒有一種方法可以根據與SELECT語句的其餘部分不同的條件來執行SUM(total_points),所以我希望SUM(total_points)爲每行都是< =到$ chosenntrack?但SELECT語句的其餘條件成爲它們下面的內容。我需要他們都被一起歸還..因爲我正在填充一個聯賽桌。SUM()基於不同條件的SELECT

非常感謝您的幫助。

SELECT 
    members.member_id, 
    members.teamname, 
    SUM(total_points) as total_points, 
    total_points as last_race_points 
FROM 
    members, 
    members_leagues, 
    member_results 
WHERE 
    members.member_id = members_leagues.member_id 
    AND members_leagues.league_id = '$chosenleague' 
    AND member_results.track_id = '$chosentrack' 
    AND members_leagues.start_race = '$chosentrack' 
    AND member_results.member_id = members_leagues.member_id 
GROUP BY 
    members.member_id 
ORDER BY 
    member_results.total_points DESC, 
    last_race_points DESC, 
    members.teamname DESC 
+0

[SQL sum with condition]的可能重複(http://stackoverflow.com/questions/4517681/sql-sum-with-condition) – Athafoud

+1

@Athafoud你真的在挖掘東西了。令人印象深刻。 – Drew

回答

20

你也可以把總和case語句,其中的情況下評估其他條件裏面,然後只放入系統總結其中的記錄條件爲真...

SELECT m.member_id, m.teamname, 
    Sum(Case When r.track_Id = '$chosentrack' 
     Then total_points Else 0 End) TotalChosenTrackPoints, 
    Sum(Case When r.track_Id < '$chosentrack' 
     Then total_points Else 0 End) TotalLessThanChosenTrackPoints, 
    total_points as last_race_points 
FROM members m 
    Join members_leagues l 
     On l.member_id = m.member_id 
    Join member_results r 
     On r.member_id = m.member_id 
Where l.league_id = '$chosenleague' 
    And l.start_race = '$chosentrack' 
Group By m.member_id 
Order By r.total_points Desc, 
    last_race_points Desc, m.TeamName Desc 
+0

但它仍然沒有計算members_results表中的track_id小於$ chosenntrack的所有行的total_points?它唯一的計算total_points爲何等於$ chosenntrack? – user970117

+0

由於[編輯]它應該計算member_results.trackId等於$ chosenntrack的所有行的總和,以及其中member_results.trackId小於$ chosenntrack的所有行的總點數。我不得不刪除條款中的條款... –

+1

你的一個美麗的男人!效果很好。再次感謝。 – user970117

1

執行和作爲子查詢,確保你選擇的附加列(不要忘記按該列組),加入這個子選擇使用公共領域的主要查詢的結果。

模板:

Select col1, 
col2 as t,x.thesum 
From table t left join 
(select sum(colx) as thesum, col1 from t where ... 
Group by col1) x on t.col1=x.col1 
Where .... 
+0

對不起,所以我希望SUM(total_points)爲<=到$ chosenntrack,這是在聲明的其餘部分使用相同的變量的每一行,你的答案仍然適用於此? – user970117

+1

是的,它適用,它應該工作。這只是一種方法。起初,我沒有意識到你是從同一個表中選擇列並應用單一條件,這樣'案例'可能更易讀,並且可能更容易通過RDBMS進行優化。 – Icarus

2
SELECT ... 
SUM(CASE 
WHEN track_id <= [your_value] THEN total_points 
ELSE 0 
END 
) AS total_points, ....