Próbowałem ponownej zrobić to stwierdzenie, ale bezskutecznie.SQL SUM i CASE i odrębnych
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
Teraz będę się wyniki takie jak:
Program Males Females Arts MalesAverage
---------------------------------------
Program 7 5 1 50.000000
Problemem jest to, że istnieją tylko 4 mężczyźni i 3 kobiety, a kiedy dodać tblActivites, wydaje się dawać duplikatów. Po przejrzeniu zauważyłem, że w tablicy Czynności znajduje się 12 ChildID, powodem jest to, że Dzieci były związane z więcej niż jedną aktywnością. Próbowałem użyć coś takiego:
SELECT SUM(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN 1 ELSE NULL END) AS Males
Jednak po prostu wrócił 1 pod kolumną Mężczyźni. Każda pomoc będzie doceniona. Aby dalej wyjaśnić, tabele są szyfrowane za pomocą identyfikatora ChildID, potrzebuję pomocy, aby upewnić się, że zwrócę odpowiednie informacje. Jeśli to zostanie rozwiązane, moja ogromna lista tych rzeczy zostanie rozwiązana. Unikanie GROUP BY na wszystko jest preferowane, ponieważ mam dużo danych.
@niktrs Jak wyjaśniono w odpowiedzi poniżej, które nadal daje 7 mężczyzn, gdy odpowiednie wyniki powinny być 4. – jnewkirk
wyboru stosunki między stołem a przyłączyć tych. Uruchom zapytanie bez agregatów i sprawdź wynik pod kątem czegoś dziwnego. – niktrs