2014-01-06 144 views
2

我想要查找講師在特定年份教過的模塊數量,並希望爲該講師選擇講師姓名和模塊數量。按字段進行分組

問題是,因爲我選擇Name,我必須按名稱對它進行分組才能使其工作。但如果有兩位同名的講師呢?然後SQL將使他們一個,這將是錯誤的輸出。

所以我真正想要做的是選擇name但由id組,這是SQL不允許我做的。有沒有辦法解決它?

下面是表:

Lecturer(lecturerID, lecturerName) 
Teaches(lecturerID, moduleID, year) 

這是我的查詢到目前爲止:

SELECT l.lecturerName, COUNT(moduleID) AS NumOfModules 
FROM Lecturer l , Teaches t 
WHERE l.lecturerID = t.lecturerID 
AND year = 2011 
GROUP BY l.lecturerName --I want lectureID here, but it doesn't run if I do that 

回答

2
SELECT a.lecturerName, b.NumOfModules 
FROM Lecturer a,(
SELECT l.lecturerID, COUNT(moduleID) AS NumOfModules 
    FROM Lecturer l , Teaches t 
    WHERE l.lecturerID = t.lecturerID 
    AND year = 2011 
    GROUP BY l.lecturerID) b 
WHERE a.lecturerID = b.lecturerID 
+0

非常感謝。最簡單的一個要理解我。 –

2

你或許應該只是lecturerID組包括它在選擇列列表。否則,你將最終得到兩行包含相同的名稱,無法區分它們。

你提出「錯誤的輸出」的問題時,只按名稱分組,但「不可破譯的輸出」是一樣大的問題。換句話說,你需要的輸出(通過ID,但給人名稱分組):

lecturerName Module 
------------ ------ 
Bob Smith   1 
Bob Smith   2 

沒有比你的錯誤的輸出更好的(通過分組,並給予,名):

lecturerName Module 
------------ ------ 
Bob Smith   3 

,因爲雖然你現在知道一個的講師教了兩個模塊,另一個教了一個,你不知道哪個是哪個。

更好輸出(通過ID分組和顯示兩個編號和名稱)將是:

lecturerId lecturerName Module 
---------- ------------ ------ 
    314159 Bob Smith   1 
    271828 Bob Smith   2 

而且,是的,我知道這並不能回答你的具體要求,但有時對"How do I do XYZZY?"的正確答案是"Don't do XYZZY, it's a bad idea for these reasons ..."

事情如Pascal寫在COBOL操作系統,會計軟件包彙編,或什麼浮現在腦海中瞬間:-)

+0

也許你可以包括一些SQL的OP展示瞭如何通過ID組(只),並同時顯示ID和姓名,因爲這不是明顯的一些人。我完全支持回答問題的想法,而不是解決問題,但我經常這樣做,你會得到我的讚賞。 –

+0

謝謝你的回答。我同意你對I​​D和名稱的需求,但這是過去的紙質問題,問題只是要求名稱和數量,因此我不能包含任何其他內容。只是這個問題的設計不正確。不過謝謝。 –

1

你可以子查詢的count語句。

SELECT lecturername, 
     (SELECT Count(*) 
     FROM teaches t 
     WHERE t.lecturerid = l.lecturerid 
       AND t.year = 2011) AS NumOfModules 
FROM lecturer l 

請注意,還有其他方法可以做到這一點。如果您還想消除沒有模塊的行,則可以嘗試。

SELECT * 
FROM (SELECT lecturername, 
       (SELECT Count(*) 
       FROM teaches t 
       WHERE t.lecturerid = l.lecturerid 
         AND t.year = 2011) AS NumOfModules 
     FROM lecturer l) AS temp 
WHERE temp.numofmodules > 0 
相關問題