J'ai essayé de refaire cette déclaration mais en vain.SQL SUM et CASE et 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
Maintenant, je vais obtenir des résultats comme:
Program Males Females Arts MalesAverage
---------------------------------------
Program 7 5 1 50.000000
Le problème est qu'il n'y a que 4 mâles et 3 femelles, et que quand j'ajoute les tblActivites, il semble donner des doublons. Après avoir regardé à travers j'ai remarqué qu'il y avait 12 ChildID dans la table des Activités, la raison étant que les enfants étaient liés à plus d'une activité. J'ai essayé d'utiliser quelque chose comme:
SELECT SUM(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males
Cependant, il a juste retourné 1 sous la colonne des mâles. Toute aide serait appréciée. Et juste pour clarifier plus loin, les tables sont clavées ensemble par le ChildID, j'ai juste besoin d'aide m'assurant que je retourne la bonne information. Si cela est résolu, alors ma liste massive de ces choses sera résolue. Éviter GROUP BY pour tout est préférable vu que j'ai beaucoup de données.
@niktrs Comme expliqué dans la réponse ci-dessous qui donne encore 7 mâles, quand les résultats appropriés devraient être 4. – jnewkirk
vérifier les relations entre la table et les jointures. Exécutez la requête sans les agrégats et vérifiez le résultat pour quelque chose d'étrange. – niktrs