CASE
および GROUP BY
と crosstab
関数 PostgreSQL では、多くのユーザーが分析やレポート作成のために行データ テーブルを列データ テーブルに変換する必要があります。 CASE
と GROUP BY
は一般的に使用されるメソッドですが、より動的で効率的な代替手段も存在します。
たとえば、次の表を考えてみましょう:
id | feh | bar |
---|---|---|
1 | 10 | A |
2 | 20 | A |
3 | 3 | B |
4 | 4 | B |
5 | 5 | C |
6 | 6 | D |
7 | 7 | D |
8 | 8 | D |
必要な出力 このデータを次の形式に変換します:
bar | val1 | val2 | val3 |
---|---|---|---|
A | 10 | 20 | NULL |
B | 3 | 4 | NULL |
C | 5 | NULL | NULL |
D | 6 | 7 | 8 |
CASE
と GROUP BY
これを実現する 1 つの方法は、CASE
および GROUP BY
テクニックを使用することです。
<code class="language-sql">SELECT bar, MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1", MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2", MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3" FROM ( SELECT bar, feh, row_number() OVER (partition by bar) as row FROM "Foo" ) abc GROUP BY bar </code>
このアプローチは機能しますが、柔軟性とパフォーマンスの点で潜在的な制限があります。
crosstab
機能: 動的ソリューション モジュールによって導入された tablefunc
関数は、より動的で効率的な代替手段です。 crosstab()
関数を使用すると、出力列を明示的に定義せずに、目的の変換を実現できます。 crosstab()
crosstab
解決策は次のとおりです: crosstab
<code class="language-sql">SELECT * FROM crosstab( 'SELECT bar, 1 AS cat, feh FROM tbl_org ORDER BY bar, feh') AS ct (bar text, val1 int, val2 int, val3 int);</code>
は SELECT bar, 1 AS cat, feh
と互換性のある形式でデータを提供します。 crosstab()
列は、テーブルにカテゴリ情報がないため、ダミーのプレースホルダーとして使用されます。 cat
crosstab
<code class="language-sql">SELECT * FROM crosstab( $$ SELECT bar, val, feh FROM ( SELECT *, 'val' || row_number() OVER (PARTITION BY bar ORDER BY feh) AS val FROM tbl_org ) x ORDER BY 1, 2 $$ , $$VALUES ('val1'), ('val2'), ('val3')$$ ) AS ct (bar text, val1 int, val2 int, val3 int);</code>
crosstab
モジュールの組み込み機能を使用してこれを実現できます。 tablefunc
関数は、crosstab()
メソッドと CASE
メソッドに代わる強力かつ動的な代替手段を提供します。これにより、柔軟なデータ変換が可能になり、PostgreSQL でのデータ操作のための貴重なツールになります。 GROUP BY
以上がPostgreSQL で行指向のデータを列指向のデータに動的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。