sql >> Database >  >> RDS >> PostgreSQL

Een sql-resultaat transponeren zodat één kolom naar meerdere kolommen gaat

Overweeg de volgende 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);

Resultaat:

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

user is een gereserveerd woord. Gebruik het niet als kolomnaam! Ik heb het hernoemd naar usr .

U moet de extra module tablefunc installeren die de functie crosstab() . biedt . Merk op dat deze bewerking strikt per database is .In PostgreSQL 9.1 je kunt eenvoudig:

CREATE EXTENSION tablefunc;

Voor een oudere versie zou je een shell-script uitvoeren dat wordt geleverd in je contrib map. In Debian, voor PostgreSQL 8.4 , dat zou zijn:

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


  1. Wat is DTU in Azure SQL Database en hoe kom je erachter hoeveel we nodig hebben?

  2. Een praktisch gebruik van de SQL COALESCE-functie

  3. Een Oracle-database migreren naar MySQL op AWS, deel 2

  4. Zoeken in volledige tekst werkt niet als het stopwoord is opgenomen, ook al is de lijst met stopwoorden leeg