ホームページ > データベース > mysql チュートリアル > 「crosstab()」を使用して PostgreSQL で動的ピボット テーブルを効率的に作成するにはどうすればよいですか?

「crosstab()」を使用して PostgreSQL で動的ピボット テーブルを効率的に作成するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-20 22:51:09
オリジナル
763 人が閲覧しました

How Can I Efficiently Create Dynamic Pivot Tables in PostgreSQL Using `crosstab()`?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート