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

SQL:行を列に置き換える

    MySQLについて話すことはできませんが、PostgreSQLでは、のクロス集計関数を使用できます。 tablefunc モジュール:

    CREATE OR REPLACE VIEW PersonAttributePivot AS
        SELECT PersonId AS ID, Age, HairColor
        FROM crosstab
        (
           'SELECT PersonId, Key, Value FROM PersonAttribute',
           'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
        )
        AS
        (
            PersonId integer,
            Age text,
            HairColor text
        );
    

    クエリに参加:

    SELECT id, name, age, haircolor
    FROM Person JOIN PersonAttributePivot USING(id)
    ORDER BY id;
    

    希望する結果:

     id |    name    | age | haircolor 
    ----+------------+-----+-----------
      1 | Joe Bloggs | 27  | 
      2 | Jane Doe   |     | Brown
    (2 rows)
    

    ご覧のとおり、列の明示的なリストをPersonAttributePivotに配置しました 見る。暗黙の列リストを使用した「自動ピボット」作成方法がわかりません。

    編集:

    巨大の場合 列リスト(常にtextと仮定) タイプ)回避策として、私はそのような少し変更されたアプローチを見ます:

    動的型の作成(ここでは自明なJavaベース):

    Class.forName("org.postgresql.Driver");
    Connection c =
            DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "postgres", "12345");
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery("SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key");
    List<String> columns = new ArrayList<String>();
    
    while (rs.next())
        columns.add(rs.getString(1));
    
    System.out.println("CREATE TYPE PersonAttributePivotType AS (");
    System.out.println("\tPersonId integer,");
    for (int i = 0; i < columns.size(); ++i)
    {
        System.out.print("\t" + columns.get(i) + " text");
        if (i != columns.size() - 1)
            System.out.print(",");
        System.out.println();
    }
    System.out.println(");");
    

    結果:

    CREATE TYPE PersonAttributePivotType AS (
        PersonId integer,
        Age text,
        HairColor text
    );
    

    関数ラッパー:

    CREATE OR REPLACE FUNCTION crosstabPersonAttribute(text, text)
        RETURNS setof PersonAttributePivotType
        AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;
    

    自動ビュー作成:

    CREATE OR REPLACE VIEW PersonAttributePivot AS
        SELECT * FROM crosstabPersonAttribute
        (
           'SELECT PersonId, Key, Value FROM PersonAttribute',
           'SELECT DISTINCT Key FROM PersonAttribute ORDER BY Key'
        );
    

    結果:

    TABLE PersonAttributePivot;
     personid | age | haircolor
    ----------+-----+-----------
            1 | 27  |
            2 |     | Brown
    (2 rows)
    


    1. MySQL –エラーの修正–WordPressデータベースエラークエリのキーPRIMARYの重複エントリINSERTINTO wp_options

    2. 災害復旧のためのPostgreSQLレプリケーション

    3. Oracleでの時間のない日付タイプ

    4. Workbenchを使用してMSSQLからMySQLに移行するときに、ソースからスキーマリストを取得しない