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

时间:2012-12-05 22:35:03

标签: sql oracle oracle-apex

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

table: students
record_number    |    forename    |    surname

table: applications
id    |    record_number    |    job_id    |    status_id

record_number表中的applications字段是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 个答案:

答案 0 :(得分:0)

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

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表的主键,我希望能够为您提供至少有一个未被接受的实习的学生人数。

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