tags:

views:

541

answers:

3

Hello. Here is my query:

SELECT student_id, section, count( * ) as total FROM raw_data r WHERE response = 1 GROUP BY student_id, section

There are 4 sections on the test, each with a different number of questions. I want to know, for each student, and each section, how many questions they answered correctly (response=1).

However, with this query, if a student gets no questions right in a given section, that row will be completely missing from my result set. How can I make sure that for every student, 4 rows are ALWAYS returned, even if the "total" for a row is 0?

Here's what my result set looks like:

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

Thanks for any insight!

UPDATE: I tried

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

and that didn't change the results at all. Other ideas?

UPDATE 2: I got it working thanks to the response below:

 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
+5  A: 
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

Note that there's no WHERE condition.

Michael Krelin - hacker
the CASE WHEN code was exactly what i needed. thanks!
Jen
A: 

if you have a separate table with student information, you can select students from that table and left join the results to the data_raw table:

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

This way, it first selects all students, then executes the count command.

eykanal
+1  A: 
 SELECT r.student_id, 
             r.subject, 
             sum( r.response ) as total
        FROM raw_data r
    GROUP BY student_id, subject
JStriedl