2

postgres で列を行に転置する必要があります。以下が要件です。どんな助けでも大歓迎です。

ソース テーブル/データ:

id   class-1-male class-1-female class-2-male  class-2-female class-3-male  class-3-female 
1      1                1                11              7          0                9
2      11              31                6              7          40               92
3      15              31                8              37         30               91
4      11              13                50             17         10               19

以下の形式のデータが必要です。

id   class-type male female
1     class-1    1     1
2     class-1    11    31
3     class-1    15    31
4     class-1    11    13
1     class-2    11    7
2     class-2    6     7
3     class-2    8     37
4     class-2    50    17
1     class-3    0     9
2     class-3    40    92
3     class-3    30    91
4     class-3    10    19
4

1 に答える 1

2

反対のことをしたい場合 (実際にはより一般的です)、hte tablefunccontrib モジュールを使用できます。UNION ALLただし、この方法では、各列を個別に使用してクエリを実行するだけです。

SELECT id, 'class-1' AS class-type,
       class-1-male AS male, class-1-female AS female
FROM your_table
UNION ALL
SELECT id, 'class-2' AS class-type,
       class-2-male AS male, class-2-female AS female
FROM your_table
UNION ALL
SELECT id, 'class-3' AS class-type,
       class-3-male AS male, class-3-female AS female
FROM your_table

このテーブルの行が多すぎる場合、これは最適なオプションではない可能性があります。クエリごとにデータセット全体を読み取るためです。別のオプションは、セットを返す関数を作成することです。

CREATE OR REPLACE FUNCTION classes_transpose()
RETURNS TABLE(id int, class_type text, male int, female int)
LANGUAGE PLPGSQL
STABLE
AS $$
DECLARE
    v RECORD;
BEGIN
    FOR v IN SELECT * FROM your_table LOOP
        id := v.id;
        class_type := 'class-1';
        male := v."class-1-male";
        female := v."class-1-female";
        RETURN NEXT;
        class_type := 'class-2';
        male := v."class-2-male";
        female := v."class-2-female";
        RETURN NEXT;
        class_type := 'class-3';
        male := v."class-3-male";
        female := v."class-3-female";
        RETURN NEXT;
    END LOOP;
END;
$$;

それで:

SELECT * FROM classes_transpose();
于 2013-11-07T13:26:56.253 に答える