sql >> データベース >  >> RDS >> PostgreSQL

1つの列が複数の列に移動するようにSQL結果を転置する

    次のデモを検討してください:

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

    結果:

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

    user 予約語です。列名として使用しないでください。名前をusrに変更しました 。

    関数crosstab()を提供する追加のモジュールtablefuncをインストールする必要があります 。この操作は厳密にデータベースごとであることに注意してください .PostgreSQLの場合9.1 簡単にできます:

    CREATE EXTENSION tablefunc;
    

    古いバージョンの場合は、contribで提供されているシェルスクリプトを実行します。 ディレクトリ。 Debianでは、PostgreSQLの場合 8.4 、それは次のようになります:

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


    1. IDに基づいて値を連結します

    2. MariaDBで時間、分、秒を時間値から分離する4つの方法

    3. PostgreSQLの特定のデータベースに権限を付与する

    4. SAPIQをSQLServerに接続します