Agrupar por un campo no en seleccionar

Quiero encontrar cuántos modules enseñó un profesor en un año específico y quiero seleccionar el nombre del profesor y el número de modules para ese profesor.

El problema es que porque estoy seleccionando Name , y tengo que agruparlo por nombre para que funcione. Pero, ¿y si hay dos profesores con el mismo nombre? Entonces sql los hará uno y eso sería un resultado incorrecto.

Entonces, lo que realmente quiero hacer es seleccionar el name pero agrupar por id , que sql no me permite hacer. ¿Hay alguna forma de evitarlo?

A continuación están las tablas:

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

Esta es mi consulta hasta el momento:

 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 

 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 

Probablemente solo deba agrupar por lecturerID e includelo en la list de columnas de selección. De lo contrario, terminará con dos filas que contienen el mismo nombre sin posibilidad de distinguirlas.

Usted plantea el problema del "resultado incorrecto" cuando se agrupa solo por nombre, pero el "resultado indescifrable" es un problema tan grande. En otras palabras, su resultado deseado (agrupación por ID pero dando nombre):

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

no es mejor que su salida errónea (agrupando por, y dando, nombre):

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

ya que, si bien ahora sabe que uno de los profesores enseñó dos modules y el otro le enseñó uno, no tiene idea de cuál es cuál.

El mejor resultado (agrupar por ID y mostrar ID y nombre) sería:

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

Y, sí, soy consciente de que esto no responde a su request específica, pero a veces la respuesta correcta a "How do I do XYZZY?" es "Don't do XYZZY, it's a bad idea for these reasons ..." .

Cosas como escribir sistemas operativos en COBOL, packages de contabilidad en ensamblador, o cualquier cosa en Pascal vienen a la mente al instante 🙂

Podrías subconsultar tu statement de conteo.

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

Tenga en count que hay otras forms de hacerlo. Si también desea eliminar las filas sin modules, puede intentarlo.

 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