ピボットテーブルは、データをより管理しやすい形式に整理することにより、大量のデータを分析するための便利な方法です。 PostgreSQLでピボットテーブルを作成する方法は次のとおりです。つまり、PostgreSQLでクロス集計を作成します。
PostgreSQLでピボットテーブルを作成する方法
PostgreSQLでピボットテーブルを作成するには、少なくとも2つの方法があります。 1つはCASEステートメントを使用してPostgreSQLの行を列にピボットする場所であり、もう1つはPostgreSQLクロス集計関数の簡単な例です。
次の表があるとします
CREATE TABLE Meeting
(
ID INT,
Meeting_id INT,
field_key VARCHAR(100),
field_value VARCHAR(100)
);
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (1, 1,'first_name' , 'Alec');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (2, 1,'last_name' , 'Jones');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (3, 1,'occupation' , 'engineer');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (4,2,'first_name' , 'John');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (5,2,'last_name' , 'Doe');
INSERT INTO Meeting(ID,Meeting_id,field_key,field_value)
VALUES (6,2,'occupation' , 'engineer');
+------+------------+------------+-------------+
| ID | Meeting_id | field_key | field_value |
+------+------------+------------+-------------+
| 1 | 1 | first_name | Alec |
| 2 | 1 | last_name | Jones |
| 3 | 1 | occupation | engineer |
| 4 | 2 | first_name | John |
| 5 | 2 | last_name | Doe |
| 6 | 2 | occupation | engineer |
+------+------------+------------+-------------+
field_key の一意の値ごとに新しい列が作成されるように、PostgreSQLでピボットテーブルを作成するとします。 列、つまり(first_name、last_name、occupation) 以下に示すように
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
CASEステートメントを使用してPostgreSQLでピボットテーブルを作成する
CASEステートメントを使用して、上記の表の列に行を簡単に転置できます。
postgresql> select meeting_Id,
max(case when (field_key='first_name') then field_value else NULL end) as first_name,
max(case when (field_key='last_name') then field_value else NULL end) as last_name,
max(case when (field_key='occupation') then field_value else NULL end) as occupation
from meeting
group by meeting_Id
order by meeting_Id;
+------------+------------+-----------+------------+
| meeting_Id | first_name | last_name | occupation |
+------------+------------+-----------+------------+
| 1 | Alec | Jones | engineer |
| 2 | John | Doe | engineer |
+------------+------------+-----------+------------+
上記のステートメントでは、各行の field_key 値がチェックされ、それに応じて列にデータが入力されます。たとえば、 field_key 値は「first_name」、次に first_name 列にデータが入力されます。
PostgreSQLでピボットテーブルを作成したら、レポートツールを使用してそれをテーブルにプロットできます。 Ubiqを使用して作成されたピボットテーブルの例を次に示します。 Ubiqを使用すると、SQLを記述せずにピボットテーブルを作成できることをご存知ですか?
ボーナスリード:Redshiftで現在の合計を計算する方法
クロス集計関数を使用してPostgreSQLでピボットテーブルを作成する
PostgreSQLには、PostgreSQLでピボットテーブルを簡単に作成できる組み込みのクロス集計関数も用意されています。ただし、 table_funcをインストールする必要があります クロス集計機能を有効にする拡張機能。
postgresql> CREATE EXTENSION IF NOT EXISTS tablefunc;
次の表があるとします。
CREATE TABLE exams (
id int(11) NOT NULL auto_increment,
name varchar(15),
exam int,
score int,
PRIMARY KEY (id)
);
insert into exams (name,exam,score) values ('Bob',1,70);
insert into exams (name,exam,score) values ('Bob',2,77);
insert into exams (name,exam,score) values ('Bob',3,71);
insert into exams (name,exam,score) values ('Bob',4,70);
insert into exams (name,exam,score) values ('Sue',1,89);
insert into exams (name,exam,score) values ('Sue',2,87);
insert into exams (name,exam,score) values ('Sue',3,88);
insert into exams (name,exam,score) values ('Sue',4,89);
mysql> select * from exams;
+------+------+------+-------+
| id | name | exam | score |
+------+------+------+-------+
| 1 | Bob | 1 | 70 |
| 2 | Bob | 2 | 77 |
| 3 | Bob | 3 | 71 |
| 4 | Bob | 4 | 70 |
| 5 | Sue | 1 | 89 |
| 6 | Sue | 2 | 87 |
| 7 | Sue | 3 | 88 |
| 8 | Sue | 4 | 89 |
+------+------+------+-------+
上記の表を試験でピボットしたいとします。 以下に示すように、各学生に対して1行が表示され、すべての試験のスコアが別々の列になります。
name | exam1 | exam2 | exam3 | exam4 ------+-------+-------+-------+------- Bob | 70 | 77 | 71 | 70 Sue | 89 | 87 | 88 | 89
データベースでクロス集計機能を有効にしたので、次のクエリを使用してPostgreSQLでクロス集計を作成できます。
postgres=# SELECT * FROM crosstab('select name, exam, score from exams order by 1,2')
AS ct (name varchar(15),exam1 int, exam2 int, exam3 int, exam4 int);
name | exam1 | exam2 | exam3 | exam4
------+-------+-------+-------+-------
Bob | 70 | 77 | 71 | 70
Sue | 89 | 87 | 88 | 89
クロス集計は、3つの要件に従う必要がある入力パラメータとしてSELECTクエリで機能します
- 3列を返す必要があります
- 最初の列は、最終的なピボットテーブルの行識別子です(例:名前)
- 2番目の列は、ピボットするカテゴリ列です(例:試験)
- 3番目の列は、ピボットする値の列です。例:スコア
クロス集計は、SELECTクエリの結果を取得し、ピボットテーブルに指定した列に基づいて、そこからピボットテーブルを作成します。上記のクエリでは、ピボットテーブルは一時テーブル ct(name varchar(15)、exam1 int、exam2 int、exam3 int、exam4 int)に格納されています。 最終的なピボットテーブルの列名とデータ型を定義する必要があります。
ボーナスリード:赤方偏移で移動平均を計算する方法
私たちの意見では、PostgreSQLでピボットテーブルを作成する場合、CrosstabメソッドはCASEステートメントを使用するよりも難しいことがわかりました。これは主に、最終的なピボットテーブルの列データ型を正しく定義しないとCrosstabがエラーをスローするためです。
>それでも、PostgreSQLでピボットテーブルを作成する2つの方法を知っています。要件に応じてカスタマイズできます。
ドラッグアンドドロップするだけでUbiqでピボットテーブルを作成できることをご存知ですか?
ちなみに、PostgreSQLデータベースからピボットテーブル、チャート、ダッシュボードを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。