116

私は2つのテーブルを持っています

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

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

以下のような結果を得るために、ネイティブ Postgresql SELECT を作成することは可能ですか?

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

しかし、以下のようではありません

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

4 に答える 4

200

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

ちなみに、Postgres 9.1を使用している場合は、SELECTからGROUP BYの列を繰り返す必要はありません。たとえば、GROUPBYで学生名を繰り返す必要はありません。主キーでGROUPBYするだけです。学生の主キーを削除する場合は、GROUPBYで学生名を繰り返す必要があります。

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');
于 2012-06-07T08:56:24.940 に答える
9

私が理解していることは、あなたがこのようなことをすることができるということです:

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;

編集

私はわかりません。しかし、多分このようなもの:

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;

ここで参照

于 2012-06-07T08:34:15.407 に答える
7

以下を使用できます。

SELECT Student.Name as Name,
       (SELECT array(SELECT Mark FROM Grade WHERE Grade.Student_id = Student.Id))
       AS ArrayOfMarks 
FROM Student

ここで説明したように: http://www.mkyong.com/database/convert-subquery-result-to-array/

于 2012-06-07T08:25:45.470 に答える