2012-06-07 80 views
46

Hi Tôi có một hai bảngPostgreSQL tổng hợp mảng

Student 
-------- 
Id Name 
1 John  
2 David 
3 Will 

Grade 
--------- 
Student_id Mark 
1   A 
2   B 
2   B+ 
3   C 
3   A 

Có thể làm cho bản PostgreSQL chọn để có được kết quả như thế này:

Name Array of marks 
----------------------- 
'John',  {'A'} 
'David', {'B','B+'} 
'Will',  {'C','A'} 

Nhưng không như thế này

Name Mark 
---------------- 
'John',  'A' 
'David', 'B' 
'David', 'B+' 
'Will',  'C' 
'Will',  'A' 

Trả lời

80

Sử dụng array_agg: http://www.sqlfiddle.com/#!1/5099e/1

SELECT s.name, array_agg(g.Mark) as marks   
FROM student s 
LEFT JOIN Grade g ON g.Student_id = s.Id 
GROUP BY s.Id 

Bằng cách này, nếu bạn đang sử dụng Postgres 9.1, bạn don't need to repeat các cột trên SELECT để GROUP BY, ví dụ bạn không cần lặp lại tên sinh viên trên GROUP BY. Bạn chỉ có thể GROUP BY trên khóa chính. Nếu bạn loại bỏ khóa chính trên học sinh, bạn cần phải lặp lại tên học sinh trên GROUP BY.

CREATE TABLE grade 
    (Student_id int, Mark varchar(2)); 

INSERT INTO grade 
    (Student_id, Mark) 
VALUES 
    (1, 'A'), 
    (2, 'B'), 
    (2, 'B+'), 
    (3, 'C'), 
    (3, 'A'); 


CREATE TABLE student 
    (Id int primary key, Name varchar(5)); 

INSERT INTO student 
    (Id, Name) 
VALUES 
    (1, 'John'), 
    (2, 'David'), 
    (3, 'Will'); 
+2

Oh my god cảm ơn bạn rất nhiều về nhận xét của bạn về chọn/nhóm, đó là quá tuyệt vời! Điều đó thực sự gây phiền nhiễu! – mrbrdo

4

Những gì tôi hiểu bạn có thể làm một cái gì đó như thế này:

SELECT p.p_name, 
    STRING_AGG(Grade.Mark, ',' ORDER BY Grade.Mark) As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

EDIT

Tôi không chắc chắn. Nhưng có lẽ một cái gì đó như thế này thì:

SELECT p.p_name,  
    array_to_string(ARRAY_AGG(Grade.Mark),';') As marks 
FROM Student 
LEFT JOIN Grade ON Grade.Student_id = Student.Id 
GROUP BY Student.Name; 

Reference here

+0

Tôi nghĩ rằng ông muốn có một mảng pgsql, không phải là một chuỗi bằng dấu phẩy – ThiefMaster

+0

Cập nhật câu trả lời – Arion

Các vấn đề liên quan