Estoy tratando de ejecutar la siguiente consulta pero recibo un error de ejecución indicando que:consulta SQL avanzado - un problema con una sola fila agregada sub consulta en la cláusula select
"The column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."
número dos por debajo de la línea es la que falla con el error anterior. No entiendo por qué esta consulta no se ejecuta, ya que no debe requerirse ninguna agrupación en la línea dos, ya que el resultado es simplemente contar (*), ¿hay alguna pista sobre lo que necesito cambiar para que funcione?
SELECT @lessonPlans = COUNT(*)
, @lessonPlanResources = (SELECT COUNT(*) FROM dbo.LessonPlanResource lpr where lpr.LessonPlanId = a.LessonPlanId)
FROM
(
SELECT DISTINCT lpt.LessonPlanId
FROM dbo.LearningTargetBreakout ltb
JOIN dbo.LessonPlanLearningTarget lpt
on lpt.LearningTargetId = ltb.LearningTargetId
WHERE (CASE
WHEN ltb.LearningTargetId = @learningTargetId and @learningTargetId is not null THEN 1
WHEN ltb.CategoryId = @categoryId and @categoryId is not null THEN 1
WHEN ltb.Grade = @grade and @grade is not null THEN 1
WHEN ltb.SubjectId = @subjectId and @subjectId is not null THEN 1
ELSE 0 END) = 1
) a
[Editar]
Usando una ligera variación de la solución de Zeb - Este es el código revisado que Terminé usando, lo que da una hilera con agregados, que es lo que estaba buscando.
SELECT @lessonPlans = ISNULL(COUNT(*), 0)
, @lessonPlanResources = ISNULL(SUM(a.ResCount), 0)
FROM
(
SELECT DISTINCT lpt.LessonPlanId, lpr.ResCount
FROM dbo.LearningTargetBreakout ltb
JOIN dbo.LessonPlanLearningTarget lpt
on lpt.LearningTargetId = ltb.LearningTargetId
JOIN (SELECT LessonPlanId, COUNT(*) ResCount FROM dbo.LessonPlanResource lpr GROUP BY LessonPlanId) lpr
ON lpr.LessonPlanId = lpt.LessonPlanId
WHERE (CASE
WHEN ltb.LearningTargetId = @learningTargetId and @learningTargetId is not null THEN 1
WHEN ltb.CategoryId = @categoryId and @categoryId is not null THEN 1
WHEN ltb.GradeId = @grade and @grade is not null THEN 1
WHEN ltb.SubjectId = @subjectId and @subjectId is not null THEN 1
ELSE 0 END) = 1
) a
cuál es la razón detrás de hacer un recuento (*) y no contar (lpr.lessionplanid) – Perpetualcoder
Desde la salida de la consulta interna en el de cláusula es solo el campo LessonPlanId, en realidad es lo mismo que typing out count (lpr.lessionplanid) si no me equivoco. – James