我想找一个讲师在特定年份教授多少个模块,并希望选择讲师的名字和该讲师的模块数量。
问题在于,因为我选择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
答案 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