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

Il y a 4 sections sur le test, chacune avec un nombre différent de questions. Je veux savoir, pour chaque étudiant, et chaque section, combien de questions ils ont répondu correctement (réponse = 1).mysql SELECT COUNT (*) ... GROUP BY ... ne retourne pas les lignes où le nombre est zéro

Cependant, avec cette requête, si un étudiant ne reçoit aucune question dans une section donnée, cette ligne sera complètement absente de mon jeu de résultats. Comment puis-je m'assurer que pour chaque élève, 4 lignes sont TOUJOURS retournées, même si le "total" pour une ligne est 0?

Voici ce que mon jeu de résultats ressemble:

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 

Merci pour toute idée!

MISE À JOUR: J'ai essayé

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

et qui n'a pas changé les résultats du tout. D'autres idées?

MISE À JOUR 2: Je l'ai eu à travailler grâce la réponse ci-dessous:

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

Vous devez montrer à quoi ressemble l'entrée. –

Répondre

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 

Notez qu'il n'y a aucune condition WHERE.

+1

le cas où le code était exactement ce dont j'avais besoin. Merci! – Jen

0

si vous avez une table séparée avec l'information des élèves, vous pouvez sélectionner les étudiants de cette table et à gauche se joindre aux résultats à la table data_raw:

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 

De cette façon, il sélectionne tout d'abord tous les élèves, puis exécute la commande de compte.

1
SELECT r.student_id, 
      r.subject, 
      sum(r.response) as total 
     FROM raw_data r 
    GROUP BY student_id, subject 
Questions connexes