2009-09-25 14 views
5
SELECT student_id, section, count(*) as total 
FROM raw_data r 
WHERE response = 1 
GROUP BY student_id, section 

W teście są 4 sekcje, każda z inną liczbą pytań. Chcę wiedzieć, dla każdego ucznia i każdej sekcji, ile pytań odpowiedzieli poprawnie (odpowiedź = 1).mysql WYBIERZ LICZBĘ (*) ... GRUPA BY ... nie zwraca wierszy, gdy liczba wynosi zero

Jednak w przypadku tego zapytania, jeśli uczeń nie otrzyma żadnych pytań w danej sekcji, ten wiersz zostanie całkowicie pominięty w moim zestawie wyników. Jak mogę się upewnić, że dla każdego ucznia zwracane są ZAWSZE 4 wiersze, nawet jeśli "ogółem" dla wiersza jest 0?

Oto co mój zestaw wyników wygląda następująco:

student_id section  total 
1   DAP--29  3 
1   MEA--16  2 
1   NNR--13  1 --> missing the 4th section for student #1 
2   DAP--29  1 
2   MEA--16  4 
2   NNR--13  2 --> missing the 4th section for student #2 
3   DAP--29  2 
3   MEA--16  3 
3   NNR--13  3 --> missing the 4th section for student #3 
4   DAP--29  5 
4   DAP--30  1 
4   MEA--16  1 
4   NNR--13  2 --> here, all 4 sections show up because student 4 got at least one question right in each section 

dzięki za wgląd!

UPDATE: Próbowałem

SELECT student_id, section, if(count(*) is null, 0, count(*)) as total 

i że nie zmieni wyników w ogóle. Inne pomysły?

UPDATE 2: Mam to działa dzięki poniższej reakcji:

SELECT student_id, section, SUM(CASE WHEN response = '1' THEN 1 ELSE 0 END) AS total 
FROM raw_data r 
WHERE response = 1 
GROUP BY student_id, section 
+0

Musisz pokazać, jak wygląda wejście. –

Odpowiedz

9
SELECT student_id, section, sum(case when response=1 then 1 else 0 end) as total 
FROM raw_data_r GROUP BY student_id, section 

Zauważ, że nie ma WHERE warunek.

+1

PRZYPADEK, GDY kod był dokładnie tym, czego potrzebowałem. dzięki! – Jen

0

jeśli masz osobną tabelę z informacjami dla studentów, można wybrać uczniów z tej tabeli i lewo dołączyć wyniki do data_raw tabeli:

SELECT si.student_name, rd.student_id, rd.section, rd.count(*) AS total 
    FROM student_info AS si LEFT JOIN raw_data AS rd USING rd.student_id = si.student_id 

ten sposób, że najpierw wybiera wszystkich studentów, a następnie wykonuje liczyć polecenie.

1
SELECT r.student_id, 
      r.subject, 
      sum(r.response) as total 
     FROM raw_data r 
    GROUP BY student_id, subject 
Powiązane problemy