如何将两列中不同的值计算为一个数字



我正在处理的两个表是:

提交:

+----+------------+
| id | student_id |
+----+------------+
|  1 |          1 |
|  2 |          2 |
|  3 |          3 |
+----+------------+

组提交:

+----+---------------+------------+
| id | submission_id | student_id |
+----+---------------+------------+
|  1 |             1 |          2 |
|  2 |             2 |          1 |
+----+---------------+------------+

只有一名学生实际提交并进入提交表格,而其他学生则进入小组提交表格(如果提交是小组提交(

我想统计一下作为一个小组或单独提交的学生的唯一数量

我希望最后只返回数字(3基于上表中的数据(

如果提交表格中的学生在小组提交表格中,则不应将其计算两次,反之亦然。

此外,只完成了个人提交(不在小组提交表中(的学生也应被计算在内,无论他们是否曾参加过小组提交

我已经在构建的查询中对这些表进行了一些其他操作,所以如果你能给我一个基于连接这两个表的解决方案,那将有所帮助。

这就是我尝试过的:

count(distinct case when group_submissions.student_id is not null then group_submissions.student_id end) + count(distinct case when submissions.student_id is not null then submissions.student_id end)

但它给了我重复的数据,所以如果一个学生同时在两张表中,他会被计算两次。

有什么想法吗?

注意:这是一个MySQL数据库。

我想你想要union和一个计数:

select count(*)
from ((select student_id
from submissions
) 
union   -- on purpose to remove duplicates
(select student_id
from group_submissions
)
) s;

听了澄清之后,我认为强迫自己使用联接来计算这一点是不明智的。相反,您可以将计数作为一个简单的表达式作为最终结果。使用UNION然后使用distinct将有助于构建这样的表达式。

下面的旧答案不适合这个问题:

需要对当前版本进行非常简单的修复。。。

count(distinct case when group_submissions.student_id is not null then
group_submissions.student_id when assignment_submissions.student_id is
not null then assignment_submissions.student_id end)

注:

  • 您的原始表达式是两个大小写表达式之间的加法,每个表达式内部都有一个WHEN
  • 现在我把它变成一个带有2个WHEN的``SQL的大小写表达式

最新更新