2014-01-06 112 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 
相关问题