【问题标题】:mysql SELECT COUNT(*) ... GROUP BY ... not returning rows where the count is zeromysql SELECT COUNT(*) ... GROUP BY ...不返回计数为零的行
【发布时间】:2009-09-25 16:47:16
【问题描述】:
SELECT student_id, section, count( * ) as total
FROM raw_data r
WHERE response = 1
GROUP BY student_id, section

测试有 4 个部分,每个部分的问题数量不同。我想知道,对于每个学生和每个部分,他们正确回答了多少问题(response=1)。

但是,使用此查询,如果学生在给定部分没有正确回答问题,那么我的结果集中将完全丢失该行。我如何确保对于每个学生,总是返回 4 行,即使一行的“总数”为 0?

这是我的结果集的样子:

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

感谢您的任何见解!

更新:我试过了

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

这并没有改变结果。其他想法?

更新 2:感谢以下回复:

 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

【问题讨论】:

  • 你需要显示输入的样子。

标签: sql mysql


【解决方案1】:
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

请注意,没有WHERE 条件。

【讨论】:

    【解决方案2】:
     SELECT r.student_id, 
                 r.subject, 
                 sum( r.response ) as total
            FROM raw_data r
        GROUP BY student_id, subject
    

    【讨论】:

      【解决方案3】:

      如果您有一个包含学生信息的单独表,您可以从该表中选择学生并将结果左连接到 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
      

      这样,它首先选择所有学生,然后执行计数命令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-05
        • 2016-08-14
        • 1970-01-01
        • 2016-06-28
        相关资源
        最近更新 更多