连接postgresql中多个表的结果
我有一张桌子,学生们:连接postgresql中多个表的结果,sql,postgresql,Sql,Postgresql,我有一张桌子,学生们: student_id | name | course ------------------------------------- 1 | Jack | Comp_Sci 2 | John | Maths 3 | Matt | Comp_Sci 4 | Pete | Biology 表2:各部门: course | department ------------------------- Comp
student_id | name | course
-------------------------------------
1 | Jack | Comp_Sci
2 | John | Maths
3 | Matt | Comp_Sci
4 | Pete | Biology
表2:各部门:
course | department
-------------------------
Comp_Sci | Comp_and_Math
Maths | Comp_and_Math
Biology | Bio_and_Chem
使用计算机的表格
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
和台式计算机
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
我已经写了两个查询,但我不知道如何连接它们:
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;
它不会重用以前的查询:
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
;
其想法是按部门和计算机加入每个表和组,以获得每个部门的计算机(品牌)数量。这是在分组
子选择中完成的。我们现在拥有所需的所有数据和计数
然后我们只需按部门分组并汇总所有内容。列表必须全部在一行中?是的,按部门一行是的,这对于一个查询来说非常糟糕。让我看看有没有人回答你。我现在没有时间。最好的情况是在一个简单的列表结果中解决它,在应用程序代码中(不管它是什么),您可以根据需要格式化它。这并不像我想的那么难,实际上忘记了array_agg函数。太好了+1.