2016-02-26 91 views
3

我有一个学生表:加入结果

student_id | name | course 
------------------------------------- 
    1  | Jack | Comp_Sci 
    2  | John | Maths 
    3  | Matt | Comp_Sci 
    4  | Pete | Biology 

表部门:

course | department 
------------------------- 
Comp_Sci | Comp_and_Math 
Maths | Comp_and_Math 
Biology | Bio_and_Chem 

表using_computers

computer_id | student_id 
------------------------- 
1   | 2 
2   | 2 
2   | 3 
2   | 4 
3   | 1 
4   | 2 
4   | 4 

而且表的计算机

computer_id | name 
--------------------- 
1   | Apple 
2   | Dell 
3   | Asus 
4   | Acer 

而且我想列出所有使用电脑的部门这样

Comp_and_Maths: Apple 1, Dell 2, Asus 1, Acer 1, sum: 5 
Bio_and_Chem: Dell 1, Acer 1 , sum:2 

我已经写了2个查询,但我不知道如何将它们连接:

SELECT Departments.department, obj_in_class.list_ids 
    FROM Departments LEFT JOIN 
    (SELECT Departments.course, array_agg(students.student_id) AS list_ids 
    FROM Departments 
    LEFT JOIN students 
     ON Departments.course = students.course GROUP BY Departments.course) AS obj_in_class 
    ON Departments.course = obj_in_class.course GROUP BY Departments.department, obj_in_class.list_ids; 

(SELECT students.student_id AS id, array_agg(m.name) AS computers 
    FROM students LEFT JOIN 
    (SELECT computers.name, using_computers.student_id FROM using_computers LEFT JOIN computers ON using_computers.computer_id = computers.computer_id) AS m 
    ON students.student_id = m.student_id 
     GROUP BY students.student_id) AS students_with_computers; 
+0

该列表必须全部在一行吗? –

+0

是的,一行一行 – Mateusz

+0

是的,这对于一个查询来说确实很糟糕。让我们看看有人回答你。我现在没有时间。最好的情况是在一个普通的列表结果和应用程序代码中解决它(不管它是什么),你可以根据需要进行格式化。 –

回答

2

它不重用你先前查询:

SELECT 
    -- aggregate computer name and count as a string 
    grouped.department || ': ' || 
    array_to_string(array_agg(grouped.name || ' ' || grouped.count), ', ') 
    -- sum all the counts 
    || ', sum: ' || sum(grouped.count) 
    FROM (
    SELECT 
     D.department, 
     C.name, 
     count(C.name) -- count computers' name per department 
     FROM Departments D 
     JOIN students S USING (course) 
     JOIN using_computers UC USING (student_id) 
     JOIN computers C USING (computer_id) 
     GROUP BY D.department, C.name 
     ORDER BY D.department, C.name 
    ) grouped 
    GROUP BY grouped.department 
; 

SQLFiddle

想法是按部门和计算机加入每个表格和组,以获得每个部门计算机(品牌)的数量。这在grouped子选择中完成。我们现在拥有所有我们需要的数据和数量。

然后,我们只是按部门分组并汇总所有内容。

+1

这并不像我想的那么难,实际上忘记了array_agg函数。大。 +1 –