繁体   English   中英

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

[英]How to count distinct values from two columns into one number

我正在处理的两个表是这些:

提交:

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

Group_submissions:

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

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

我想计算作为一组或单独提交的学生的唯一数量

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

如果他在 group_submission 表中,则在提交表中的学生不应被计算两次,反之亦然。

此外,只进行过个人提交(不在 group_submissions 表中)的学生也应该被计算在内,无论他们是否曾经参加过小组提交

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

这是我尝试过的:

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;

听完澄清后,我认为强迫自己使用join来计算是不明智的。 您可以改为将计数作为最终结果的简单表达式。 使用 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)

笔记:

  • 您的原始表达式是 2 个 case 表达式之间的相加,每个表达式内部都有一个 WHEN
  • 现在我用 2 WHEN's``SQL 把它变成了一个单一的 case 表达式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM