CASE ステートメントと GROUP BY ステートメントを使用して動的ピボット テーブルを実装するより効率的な方法
記事で提供されているクエリと比較すると、tablefunc
拡張機能の crosstab()
関数を使用する方が効率的です。
インストール:
まず、tablefunc
拡張機能をまだインストールしていない場合はインストールします。
<code class="language-sql">CREATE EXTENSION tablefunc;</code>
基本的なクロス集計ソリューション:
このシナリオの簡単な 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>
合成カテゴリ列:
実際のカテゴリ列がない場合は、ウィンドウ関数を使用して合成カテゴリ列を作成できます。
<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>
動的クロス集計?
plpgsql を使用して完全に動的な crosstab
を作成するのは、動的な戻り値の型の制限のため困難です。より簡単なテスト ケースの例を次に示します:
<code class="language-sql">SELECT * FROM crosstab('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2') AS ct (row_name text, val1 int, val2 int, val3 int);</code>
tablefunc モジュール:
tablefunc
モジュールは、簡略化されたアプローチを提供します:
<code class="language-sql">SELECT * FROM crosstab1('SELECT row_name, attrib, val::text FROM tbl ORDER BY 1,2');</code>
以上が「crosstab()」を使用して PostgreSQL で動的ピボット テーブルを効率的に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。