2017-04-07 71 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)