按字段分组不在选择中

时间:2014-01-06 01:57:05

标签: sql group-by

我想找一个讲师在特定年份教授多少个模块,并希望选择讲师的名字和该讲师的模块数量。

问题在于,因为我选择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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

您应该只按lecturerID进行分组,将其包含在选择列列表中。否则,您将最终得到两行包含相同名称但无法区分它们。

在按名称分组时会引发“输出错误”的问题,但“难以理解的输出”也是一个大问题。换句话说,您想要的输出(按ID分组但给出名称):

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

并不比你的错误输出更好(按名称分组和给出名称):

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

因为,虽然你现在知道一个的讲师教了两个模块,另一个教了一个,但你不知道哪个是哪个。

更好输出(按ID分组并显示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 ..."

在COCOL中编写操作系统,在汇编程序中编写会计软件包,或者在Pascal中编写任何的内容立即浮现在脑海中: - )

答案 2 :(得分:1)

你可以查询你的计数陈述。

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