2011-05-01 272 views
1

我一直在查詢中遇到一些困難。我有兩個表(略不相關的數據):需要關於SQL查詢的幫助

學生(SID,職業),其中的職業生涯或者是 「ugrd」 或 「GRD」,
的memberOf(studentid,組名)

SELECT "GROUPNAME" FROM "MEMBEROF" 
INNER JOIN "STUDENT"  //to get rid of students not in a group 
ON "SID" = "STUDENTID" 
GROUP BY "GROUPNAME"  //so that no duplicates are listed 

這是我迄今爲止工作的代碼,但它只列出了其中有學生的組。我需要一個能夠列出比「UGRD」更多的「GRD」學生的團體的查詢,但是我不確定如何去比較每個團隊中的本科生的數量和畢業生的數量,並選擇更多的畢業生。

到目前爲止,我已經嘗試使用計數函數,但一直無法找出一種方法來處理它的方式,可以回答問題。我真的很想了解如何獲得我需要的結果以及它的工作原理。如果有人能幫忙,我會很感激。謝謝。

回答

2

這應該給你沒有學生的團體,以及畢業生和本科生的人數。 (我把內部改爲了左連接)。總和想法來自Matthew Jones,所以如果這對你也有幫助,請給他加票。然後,您可以在Grads和UGrads欄上做一個條款。

SELECT "GROUPNAME", 
SUM(CASE WHEN career= 'grd' THEN 1 ELSE 0 END) AS 'Grads', 
SUM(CASE WHEN career = 'ugrd' THEN 1 ELSE 0 END) AS 'UGrads' 
FROM "MEMBEROF" 
LEFT JOIN "STUDENT"  //to get rid of students not in a group, but keep groups with no students 
ON "SID" = "STUDENTID" 
GROUP BY "GROUPNAME"  //so that no duplicates are listed 
HAVING Grads > UGrads 

編輯:修改基於評論。

+1

您不能使用'WHERE'條款履行GRD/UGRD過濾器的要求,因爲你不直到分組後才知道聚合值,但是可以使用'HAVING'子句:'HAVING SUM(CASE WHEN CAREER ='GRD'THEN 1 ELSE 0 END)> SUM(CASE WHEN CAREER ='UGRD'THEN 1 ELSE 0 END)'。 (我會失去所有的雙引號,但是如果它們包含在內,那麼列名和表名必須與定義匹配;而列值周圍的雙引號應該是單引號)。 – 2011-05-01 22:11:22

+0

你應該提到,最後可以添加'HAVING Grads> UGrads'子句(而不是'WHERE')。 – 2011-05-01 22:47:06

+0

@亞歷山大我知道在我輸入時引用感覺不對,謝謝。剩下的問題是如何解決的。固定提及要去哪裏。謝謝,它已經使用了一段時間了。 – 2011-05-02 02:01:13

0

的HAVING條件可以寫成:

HAVING SUM(CASE WHEN CAREER = 'GRD' THEN 1 ELSE 0 END) 
    > SUM(CASE WHEN CAREER = 'UGRD' THEN 1 ELSE 0 END) 

或像這樣:

HAVING SUM(CASE WHEN CAREER = 'GRD' 
        THEN 1 
       WHEN CAREER = 'UGRD' 
        THEN -1 
       ELSE 0 END) 
     > 0