PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trasporre un risultato sql in modo che una colonna vada su più colonne

Considera la seguente demo:

CREATE TEMP TABLE qa (id int, usr int, question_id int, answer_id int);
INSERT INTO qa VALUES
 (1,1,1,1)
,(2,1,2,9)
,(3,1,3,15)
,(4,2,1,2)
,(5,2,2,12)
,(6,2,3,20);

SELECT *
FROM   crosstab('
    SELECT usr::text
          ,question_id
          ,answer_id
    FROM qa
    ORDER BY 1,2')
 AS ct (
     usr text
    ,q1 int
    ,q2 int
    ,q3 int);

Risultato:

 usr | q1 | q2 | q3
-----+----+----+----
 1   |  1 |  9 | 15
 2   |  2 | 12 | 20
(2 rows)

user è una parola riservata. Non usarlo come nome di colonna! L'ho rinominato in usr .

È necessario installare il modulo aggiuntivo tablefunc che fornisce la funzione crosstab() . Nota che questa operazione è strettamente per database .In PostgreSQL 9.1 puoi semplicemente:

CREATE EXTENSION tablefunc;

Per le versioni precedenti eseguiresti uno script di shell fornito nel tuo contrib directory. In Debian, per PostgreSQL 8.4 , sarebbe:

psql mydb -f /usr/share/postgresql/8.4/contrib/tablefunc.sql