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.
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
Vous devez vous connecter pour publier un commentaire.
Serait-ce de travailler?
Je soupçonne qu'il y a de meilleures façons de faire la jointure dans l'ensemble, mais sans en connaître beaucoup plus sur le schéma je ne sais vraiment pas.
J'aimerais commencer avec, quelles sont les principales clés de ces tables? Mais je pense que le COMTE expression que j'ai donné traitera votre problème immédiat.
Cela fonctionne, cependant je pourrait aussi besoin de quelques éclaircissements pour AVG fonction d'agrégation cependant, je vous remercie de votre aide beaucoup.
OriginalL'auteur Dave Costa
Vous de ne pas montrer la source de données, mais je suis prêt à parier que vous avez plusieurs lignes par personne et par programme.
Vous
GROUP BY Program
qui agrégats par programme, mais si tu disJohn Smith
a deux lignes avec ce programme ID, il est compté commeMALE
deux fois.Veuillez nous présenter votre structure de la table afin que nous puissions vous donner une meilleure requête. Idéalement, vous obtiendrez le comptage d'une sous-sélection à l'aide d'un
GROUP BY
sur quelque chose commePerson_ID
de sorte que vous n'obtenez pas de double compte.OriginalL'auteur JNK