sql - MySQL 查询 - 使用分组时获取丢失的记录

标签 sql mysql group-by

我有一个疑问:

select score, count(1) as 'NumStudents' from testresults where testid = 'mytestid'
group by score order by score

其中 testresults 表包含学生在测试中的表现。示例结果如下所示,假设测试的最高分数为 10。

score, NumStudents

0 10
1 20
2 12
3 5
5 34
..
10 23

如您所见,此查询不会返回任何没有学生得分的分数记录。例如。测试中没有人得分为 4/10,并且查询输出中没有得分 = 4 的记录。

我想更改查询,以便可以获取这些缺失的记录,并将 0 作为 NumStudents 字段的值。这样我的最终输出将有 max + 1 条记录,每个可能的分数对应一个记录。

有什么想法吗?

编辑:

数据库包含多个测试,测试的最高分数是测试定义的一部分。因此,拥有一个新表来存储所有可能的分数是不可行的。从某种意义上说,每当我创建具有新最高分数的新测试时,我需要确保新表也应更改为包含这些分数。

最佳答案

SQL 擅长处理数据库中的数据值集,但不太擅长处理数据库中不存在的数据值集。

最好的解决方法是保留一个小表来存储您需要范围的值:

CREATE TABLE ScoreValues (score int);
INSERT INTO ScoreValues (score) 
  VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

鉴于您在另一个表中定义测试的最高分数的评论,您可以通过以下方式加入该表,只要 ScoreValues 确保具有至少一样高的值或高于最大测试的最高分:

SELECT v.score, COUNT(tr.score) AS 'NumStudents'
FROM ScoreValues v 
  JOIN Tests t ON (v.score <= t.maxmarks)
  LEFT OUTER JOIN TestResults tr ON (v.score = tr.score AND t.testid = tr.testid)
WHERE t.testid = 'mytestid'
GROUP BY v.score;

关于sql - MySQL 查询 - 使用分组时获取丢失的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/434571/

相关文章:

SQL 将 B 列中与 A 列中具有相同值的所有值连接到 A 列中的所有值

mysql - MySql 中每个组的加入项目数

sql - Django - 带有 Prefetch 对象的多个注释

sql - 我可以依靠支票约束来确保非负余额吗?

sql - 对 BigQuery 中的所有列应用函数

mysql - Arduino + Sim900 + MySql 连接问题

mysql - MERGE 语句的语法错误

Mysql复杂多列排序

python - 从 pandas DataFrame 返回最后一个有效(非空)值

python - Pandas - 将每一行除以一组平均值