2011-06-30 12 views
7

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.

+0

@niktrs Jak wyjaśniono w odpowiedzi poniżej, które nadal daje 7 mężczyzn, gdy odpowiednie wyniki powinny być 4. – jnewkirk

+0

wyboru stosunki między stołem a przyłączyć tych. Uruchom zapytanie bez agregatów i sprawdź wynik pod kątem czegoś dziwnego. – niktrs

Odpowiedz

11

to będzie działać?

COUNT(DISTINCT CASE WHEN a.Gender LIKE 'M%' THEN a.ChildID ELSE NULL END) AS Males 

Podejrzewam, że są lepsze sposoby na łączenie, ale nie wiem o wiele więcej na temat schematu, którego naprawdę nie znam.

+0

Co dokładnie trzeba wiedzieć. Mogę podać bardziej ogólne nazwy niż to, co widzę, ponieważ są to już ogólne nazwy, a nie prawdziwe. – jnewkirk

+0

Zacznę od tego, jakie są podstawowe klucze tych stołów? Ale myślę, że wyrażenie COUNT, które podałem, rozwiąże twój natychmiastowy problem. –

+0

Działa to jednak również może wymagać wyjaśnienia funkcji agregującej AVG, ale bardzo doceniam twoją pomoc. – jnewkirk

0

Nie pokazują dane źródłowe, ale jestem gotów się założyć, masz wiele wierszy za osobę za program.

Ty GROUP BY Program który agreguje na program, ale jeśli powiedzmy John Smith ma dwa wiersze z tym identyfikatorem programu, zawsze będzie liczona jako MALE dwukrotnie.

proszę pokazać nam swoją strukturę tabeli, dzięki czemu możemy dać wyraźniejszy zapytania. Idealnie dostaniesz liczyć od podselekcji użyciu GROUP BY na coś podobnego Person_ID tak, że nie liczy się duplikatów.

+0

Tego właśnie próbowałem uniknąć. Program nie jest jednak problemem. "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ą czynnością". Jak stwierdziłem, jest to problem, dziecko jest związane z więcej niż jedną działalnością naraz, produkując identyczne ChildID w tblActivities, które ma 2 kolumny. ChildID i Activity. Chciałbym jednak spróbować uniknąć GROUP BY, ale jeśli jest to nieuniknione, to chyba mogę to zrobić. – jnewkirk