Tableau d’agrégats postgresql

Salut j’ai deux tables

Student -------- Id Name 1 John 2 David 3 Will Grade --------- Student_id Mark 1 A 2 B 2 B+ 3 C 3 A 

Est-il possible de faire en sorte que Postgresql native sélectionne les résultats suivants:

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

Mais pas comme ça

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

Utilisez 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 

Par ailleurs, si vous utilisez Postgres 9.1, vous n’avez pas besoin de répéter les colonnes de SELECT pour GROUP BY, par exemple, vous n’avez pas besoin de répéter le nom de l’étudiant sur GROUP BY. Vous pouvez simplement grouper sur la clé primaire. Si vous supprimez la clé primaire sur un élève, vous devez répéter le nom de l’élève sur 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'); 

Ce que je comprends, vous pouvez faire quelque chose comme ça:

 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; 

MODIFIER

Je ne suis pas sûr. Mais peut-être quelque chose comme ça alors:

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

Référence ici

Vous pouvez utiliser les éléments suivants:

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

Comme décrit ici: http://www.mkyong.com/database/convert-subquery-result-to-array/