使用 COUNT() 仅返回每个学生一个结果

Posted

技术标签:

【中文标题】使用 COUNT() 仅返回每个学生一个结果【英文标题】:Returning only one result per student using COUNT() 【发布时间】:2012-12-05 22:35:03 【问题描述】:

首先,这是我的相关表的数据库架构:

table: students
record_number    |    forename    |    surname

table: applications
id    |    record_number    |    job_id    |    status_id

applications 表中的record_number 字段是students 表的外键。我正在尝试编写一些 SQL 以在 APEX 中生成一个条形图,其中显示了接受实习和没有实习的学生数量。

如果学生有已接受的申请,则status_id 字段为7。其他任何事情,他们都没有接受的申请。到目前为止,这是我所得到的:

SELECT NULL AS link, 'Placed' AS label, COUNT(*) AS value
FROM tbl_students students
JOIN tbl_applications applications USING (record_number)
WHERE applications.status_id = 7
UNION
SELECT NULL AS link, 'Unplaced' AS label, CASE COUNT(*) AS value WHEN value > 1 THEN 1 END
FROM tbl_students students
JOIN tbl_applications applications USING (record_number)
WHERE applications.status_id != 7

问题是,一个学生可以有很多实习,而且一次只能接受其中一个。这对于上面的第一个查询很好。但是,一个学生可以有许多未接受的实习,第二个查询将它们全部计数,而不是只计数一次(以表明 +1 学生没有未接受的实习)。

我怎样才能使查询只计算一次没有接受实习的学生,而不是将他们计算到他们有多少未接受的实习?我尝试使用 CASE 语句,但它引发了语法错误。

谢谢。

【问题讨论】:

【参考方案1】:

听起来您希望第二个查询是这样的

SELECT NULL AS link, 'Unplaced' AS label, COUNT(DISTINCT students.record_number) AS value
  FROM tbl_students students
       JOIN tbl_applications applications USING (record_number)
 WHERE applications.status_id != 7

这将计算不同 students.record_number 值的数量。由于这是students 表的主键,我希望它可以为您提供至少有一个未接受实习的学生数量。

如果该查询没有产生您正在寻找的结果,那么如果您可以发布一些示例数据和预期的输出将会很有帮助。

【讨论】:

这更接近我的需要,但是根据这个查询,当数据库中只有 6 个学生时,有 7 个学生。进一步说明,如果有 4 名学生接受了实习,则查询应返回 (null) | Unplaced | 2(null) | Placed | 4 @JamesDawson - 那么我们可能需要查看数据。理想的形式是DDLDML 语句或www.sqlfiddle.com 上我们可以玩的小提琴。

以上是关于使用 COUNT() 仅返回每个学生一个结果的主要内容,如果未能解决你的问题,请参考以下文章

elasticsearch 将结果减少到一列 - 每个文档仅返回 1 个值

count_chars — 返回字符串所用字符的信息

嵌套 CONCAT 中的 LEFT JOIN 和 IS NULL 仅返回 NULL

PHP运行查询关闭每个数组变量并返回表中的结果

VBA 过程仅返回特定日期的结果

SQLite:仅返回每组中的前 2 个结果