SQL SOMME et le BOÎTIER, et DISTINCTES

J'ai essayé de re-faire cette déclaration, mais en vain.

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 de tels résultats:

Program Males Females Arts MalesAverage
---------------------------------------
Program 7     5       1    50.000000

Le problème, c'est qu'il y a seulement 4 mâles et 3 femelles, et que lorsque j'ajoute le tblActivites, il semble donner des doublons. Après en regardant à travers, j'ai remarqué qu'il y avait 12 ChildID dans les Activités de la table, la raison d'être de ces Enfants ont été lié à 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 revient tout juste 1 sous le les Hommes de la colonne. Toute aide serait appréciée. Et juste pour clarifier, les tables sont conçus ensemble via le ChildID, j'ai juste besoin d'aide pour faire sûr que je serai de retour le droit de l'information. Si c'est résolu, alors mon énorme liste de ces choses sera résolu. En évitant de GROUPE pour tout ce qui est préférable, vu que j'ai beaucoup de données.

Comme expliqué dans la réponse ci-dessous qui donne encore 7 mâles, lorsque les résultats appropriés devraient être 4.
vérifier les relations entre la table et le rejoindre. Exécuter la requête sans le agrégats et de vérifier le résultat de quelque chose d'étrange.
J'ai eu le même problème que vous. Vous ne pouvez pas faire une SOMME distincte ici, parce que ça va juste garder une ligne et vous retourne 1, comme vous l'avez vu. Vous devez utiliser COUNT DISTINCT comme Dave l'a suggéré ci-dessous, qui seront alors les mauvaises herbes, les non qualifiés des champs et de compter le reste.

OriginalL'auteur jnewkirk | 2011-06-30