2017-04-07 75 views
0

考虑以下mdl_course_completions表描述了用户结业:如何在额外列中的一个sql查询中结合2个组的查询结果?

id,bigint 
userid,bigint 
course,bigint 
timeenrolled,bigint 
timestarted,bigint 
timecompleted,bigint 
reaggregate,bigint 

要确定的,如果一门课程已经由学生完成,我用的timecompleted领域的谓语。

当此字段为空时,学生尚未完成课程,但是当此字段不为空时,表示学生已完成课程。

因此,成品按课程课程的学生人数的计数为:

SELECT mdl_course.fullname,count(*) as "number of students that didn't finish courses" 
FROM mdl_course_completions 
    INNER JOIN mdl_course on mdl_course.id = mdl_course_completions.course 
WHERE timecompleted IS NOT NULL 
GROUP BY mdl_course.fullname 
; 

结果是:

| course name | number of students that finish courses | 
|-------------|----------------------------------------| 
| course 1 | 50          | 
| course 2 | 200         | 
| course 3 | 120         | 

和学生人数的计数没'T完成当然课程是由:

SELECT mdl_course.fullname,count(*) as "number student that didn't finish courses" 
FROM mdl_course_completions 
    INNER JOIN mdl_course on mdl_course.id = mdl_course_completions.course 
WHERE timecompleted IS NULL 
GROUP BY mdl_course.fullname 
; 

结果是:

| course name | number of students that didn't finish courses | 
|-------------|-----------------------------------------------| 
| course 1 | 12           | 
| course 2 | 12           | 
| course 3 | 120           | 

我不知道如何可以结合这2个查询在一个查询得到的结果在一个额外的列如:

| course name | number of students that finish courses | number of students that didn't finish courses | 
|-------------|------------------------------------|-------------------------------------------| 
| course 1 | 50         | 12          | 
| course 2 | 200        | 12          | 
| course 3 | 120        | 120          | 

我使用postgresql.In我看来,这种东西与数据库系统无关。我只是不知道如何继续将这两个查询合并成一个额外的列与GROUP BY子句。

回答

2

使用条件聚合。

SELECT mdl_course.fullname 
,SUM((timecompleted IS NOT NULL)::int) as "number student that finish courses" 
,SUM((timecompleted IS NULL)::int) as "number student that didn't finish courses" 
FROM mdl_course_completions 
INNER JOIN mdl_course on mdl_course.id = mdl_course_completions.course 
GROUP BY mdl_course.fullname 
+0

这是工作的罚款:谢谢。我没有意识到“条件聚合”概念的存在。有关如何添加第三列的任何想法,总结两个完成课程并没有完成课程的学生? –

+0

将'count(*)'添加到查询中,这会给你总数。 –

+0

好吧,这就是诀窍,也许这对于第2个其他人计算学生列时也会更好地使用'count'语句? –

1

和PostgreSQL 9.4,你可以使用FILTER子句与聚合函数:

count(*) FILTER (WHERE timecompleted IS NOT NULL)