He estado tratando de volver a hacer esta afirmación, pero fue en vano.SQL SUM y CASE y DISTINCT
SELECT b.Program AS Program,
SUM(CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males,
SUM(CASE WHEN a.Gender LIKE 'F%' THEN 1 ELSE NULL END) AS Females,
SUM(CASE WHEN e.Activity LIKE 'Arts' THEN 1 ELSE NULL END) AS Arts,
AVG(CASE WHEN a.Gender LIKE 'M%' THEN CAST(f.Score AS DEC(10,2)) ELSE NULL END)
AS MalesAverage
FROM tblChildren a
LEFT JOIN tblInvolvement b ON b.ChildID = a.ChildID
LEFT JOIN tblActivities e ON e.ChildID = b.ChildID
LEFT JOIN tblScores f ON f.ChildID = b.ChildID
WHERE b.Place = 'Location'
AND b.Program = 'Program'
AND b.Year = '2009-10'
AND f.Assessment LIKE '%Pre%Assessment%'
AND e.StudentID = b.StudentID
GROUP BY Program
Ahora voy a obtener resultados como:
Program Males Females Arts MalesAverage
---------------------------------------
Program 7 5 1 50.000000
El problema con esto es que sólo hay 4 hombres y 3 mujeres, y que cuando agrego los tblActivites, parece dar duplicados. Después de revisar, noté que había 12 ChildID en la tabla de Actividades, porque los Niños estaban vinculados a más de una actividad. Traté de usar algo como:
SELECT SUM(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males
Sin embargo, acaba de regresar 1 en la columna de los hombres. Cualquier ayuda sería apreciada. Y solo para aclarar más, las tablas están unidas mediante ChildID, solo necesito ayuda para asegurarme de que estoy devolviendo la información correcta. Si esto se resuelve, mi lista masiva de estas cosas se resolverá. Es preferible evitar GROUP BY para todo, ya que tengo muchos datos.
@niktrs Como se explica en la respuesta a continuación que aún da 7 hombres, cuando los resultados adecuados deberían ser 4. – jnewkirk
compruebe las relaciones entre la tabla y las uniones. Ejecuta la consulta sin los agregados y verifica el resultado por algo extraño. – niktrs