2013-03-15 40 views
2

我一直在研究SQLzoo問題,但在JOIN教程問題#13中最後一個問題上遇到了問題 - 列出每個比賽的每個球隊得分,如圖所示。SQLzoo JOIN教程#13

鏈接:http://sqlzoo.net/wiki/The_JOIN_operation

在他們給的示例代碼,它使用的情況。我修改了它這樣的:

SELECT game.mdate, game.team1, 
    CASE WHEN goal.teamid=game.team1 THEN 1 ELSE 0 END score1, game.team2, 
    CASE WHEN goal.teamid=game.team2 THEN 1 ELSE 0 END score2 
    FROM game, goal WHERE game.id=goal.matchid 
GROUP BY game.mdate, goal.matchid, game.team1, game.team2 

他們建議使用在score1/score2一個SUM函數將提供答案。我很困惑如何在SQL中創建的這兩列上使用SUM函數。

任何人都可以提供關於如何做或提到廣義的術語如何以更好的方式寫這個SQL查詢提示?

回答

3

那麼,你需要SUM那些列(SUM是一個聚合函數,這就是爲什麼你有一個GROUP BY那裏)。而作爲以更好的方式編寫查詢,你需要減肥舊隱JOIN風格和使用ANSI明確一個:

SELECT game.mdate, 
     game.team1, 
     SUM(CASE WHEN goal.teamid=game.team1 THEN 1 ELSE 0 END) score1, 
     game.team2, 
     SUM(CASE WHEN goal.teamid=game.team2 THEN 1 ELSE 0 END) score2 
FROM game 
INNER JOIN goal 
    ON game.id=goal.matchid 
GROUP BY game.mdate, goal.matchid, game.team1, game.team2 
+0

啊得到了它。我在整個CASE語句上做了SUM函數,包括我正在創建的列......愚蠢的我。我會按照你的寫作查詢建議以易於閱讀的方式:) – Paul 2013-03-15 18:57:24

+11

內連接在沒有進球的犯規照顧的情況。所以查詢給出了錯誤的結果。使用左連接給出正確的結果。 – 2014-01-04 04:38:33

1

你的SQL是相當不錯的,你只需要SUM聚集的一個很好的例子功能。
這裏是我的解決方案:

SELECT mdate, 
team1, SUM(CASE game.team1 WHEN goal.teamid THEN 1 ELSE 0 END) 'score1', 
team2, SUM(CASE game.team2 WHEN goal.teamid THEN 1 ELSE 0 END) 'score2' 
FROM game LEFT JOIN goal ON game.id=goal.matchid 
GROUP BY game.id 
ORDER BY mdate, matchid, team1, team2 

注:我原來的職位給了一個不正確的值,需要使用LEFT JOIN而不是INNER JOIN。如果兩隊的得分均爲0,則左聯合會處理這種情況,但內聯不會提取這些情況。

+1

這不是一個有效的解決方案。 -1,如果我能.. – 2015-05-27 22:17:09

+1

@DanielJohnson你是對的,正確的答案需要一個左連接,而不是內部聯接。我回到原來的教程,並檢查了答案。謝謝。 – 2015-05-27 22:53:26

+1

@MarcAudet這仍然不是一個有效的解決方案,你需要按mdate,TEAM1,TEAM2以及.. – 2016-09-08 09:34:51

10

這對我左校正修正工作。

SELECT mdate, team1, 
SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) score1, 
team2, 
SUM(CASE WHEN teamid = team2 THEN 1 ELSE 0 END) score2 
FROM game LEFT JOIN goal ON matchid = id GROUP BY mdate, matchid, team1, team2 
+0

謝謝...................... ......................................... – 2015-09-15 04:41:49