sql >> Base de Datos >  >> RDS >> PostgreSQL

Transponer un resultado sql para que una columna vaya a varias columnas

Considere la siguiente demostración:

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);

Resultado:

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

user es una palabra reservada. ¡No lo use como nombre de columna! Le cambié el nombre a usr .

Debe instalar el módulo adicional tablefunc que proporciona la función crosstab() . Tenga en cuenta que esta operación es estrictamente por base de datos .En PostgreSQL 9.1 simplemente puede:

CREATE EXTENSION tablefunc;

Para una versión anterior, ejecutaría un script de shell proporcionado en su contrib directorio. En Debian, para PostgreSQL 8.4 , eso sería:

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