2012-06-07 16 views
46

Hola tengo unas dos mesasPostgresql matriz agregada

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

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

¿Es posible hacer nativa PostgreSQL seleccione para obtener resultados como este:

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

Pero no como esto

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

Respuesta

80

Uso 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 

Por cierto, si está utilizando PostgreSQL 9.1, don't need to repeat las columnas de SELECT para GRUPO BY, por ejemplo no es necesario que repita el nombre del alumno en GROUP BY. Puede simplemente agrupar BY en la clave principal. Si elimina la clave primaria del alumno, debe repetir el nombre del alumno en 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 por Dios muchas gracias por su comentario acerca de selección/grupo, es tan impresionante! Eso fue realmente molesto! – mrbrdo

4

Lo que entiendo que puede hacer algo como esto:

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; 

EDITAR

no estoy seguro. Pero tal vez algo como esto, entonces:

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; 

Referencia here

+0

Creo que quiere un arreglo pgsql, no una cadena separada por comas – ThiefMaster

+0

Actualización de la respuesta – Arion

Cuestiones relacionadas