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

Transponering af et sql-resultat, så en kolonne går over i flere kolonner

Overvej følgende 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);
 

Resultat:

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

user er et reserveret ord. Brug det ikke som kolonnenavn! Jeg omdøbte den til usr .

Du skal installere det ekstra modul tablefunc, som giver funktionen crosstab() . Bemærk, at denne handling strengt taget er pr. database .I PostgreSQL 9.1 du kan blot:

CREATE EXTENSION tablefunc;
 

For ældre versioner ville du udføre et shell-script, der er leveret i dit contrib vejviser. I Debian, til PostgreSQL 8.4 , det ville være:

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


  1. Hvordan øges dbms_output buffer?

  2. Udførelsesrækkefølge for SQL-forespørgslen

  3. Psql liste over alle tabeller

  4. ORA-06502:PL/SQL:numerisk eller værdifejl:tegnstrengbuffer for lille