2012-11-07 130 views
-2

由於長時間沒有使用SQL查詢而遺忘了SQL查詢。一個表上的複雜SQL查詢

我有以下要求。 有一張名爲「匹配」的表格,我保留了我的團隊與他們對戰的比賽方面的競爭對手詳情。所以一些重要的領域是這樣的

match_id 
competior_id 
match_winner_id 
ismatchtied 
goals_scored_my_team 
goals_scored_comp 

從這張表我想要得到所有我的競爭對手的頭對頭信息。 這樣

Competitor Matches Wins Losses Draws 
A   10  5 4  1 
B   8  3 2  1 

抽獎信息,我可以從ismatchtied設置爲「Y」或「N」得到的。 我想從一個查詢中獲取所有信息。我可以從單獨執行查詢中獲取所有信息,並在我的服務器代碼中執行復雜的邏輯處理。但是我的表現會受到打擊。

任何幫助將非常感激。

歡呼聲, Saurav

+0

'已經忘記了SQL查詢......'......說的都是真的。 – DaveRlz

+0

另外,哪些SQL ... MySQL,SQL服務器等... – DRapp

回答

0

你可以使用條件的聚集,涉及聚集函數裏面CASE表達式,像這樣:

SELECT 
    competitor_id, 
    COUNT(*) AS Matches, 
    COUNT(CASE WHEN goals_scored_my_team > goals_scored_comp THEN 1 END) AS Wins, 
    COUNT(CASE WHEN goals_scored_my_team < goals_scored_comp THEN 1 END) AS Losses, 
    COUNT(CASE WHEN goals_scored_my_team = goals_scored_comp THEN 1 END) AS Draws 
FROM matches 
GROUP BY 
    competitor_id 
; 

當條件不滿足任何情況下將上述計算結果爲NULL。並且由於COUNT(expr)省略了空值,所以在上述查詢中的每個COUNT(CASE ...)將僅有效地計數匹配相應WHEN條件的行。

因此,第一個COUNT只計算我的團隊對競爭對手獲得更多分數的行數,即我的團隊獲勝的地方。以類似的方式,第二個和第三個CASE得到損失和抽獎的數量。

+0

非常感謝Andriy幫助.... – saurav

0

SELECT m4.competior_id,COUNT(*)作爲TotalMathces,

(從match M1 SELECT COUNT(*)其中goals_scored_my_team> goals_scored_comp AND m1.competior_id = m4.competior_id)如WINS,

(SELECT COUNT(*)作爲WIN從match平方米其中goals_scored_comp> goals_scored_my_team AND m2.competior_id = m4.competior_id)作爲輸,

(從match立方米SELECT COUNT(*)作爲WIN其中goals_scored_my_team = goals_scored_comp AND m3.competior_id = m4.competior_id),如通過m4.competior_id繪製

match FROM M4基;