場合によっては、レポートの目的で、行を列に転置したり、ピボットテーブルを作成したりする必要があります。 MySQLにはピボットを実現するための組み込み関数がないため、ピボットレポートテーブルを作成するには、SQLクエリを介してそれを実現する必要があります。 MySQLで行の値を列として表示する方法を見てみましょう。
MySQLで行の値を列として表示する方法
次の表があるとします。
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 の一意の値ごとに新しい列が作成されるように、行を列に動的に転置するとします。 列、つまり(first_name、last_name、occupation)
+------------+-------------+-------------+-------------+ | Meeting_id | first_name | last_name | occupation | +------------+-------------+-------------+-------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+-------------+-------------+-------------+
MySQLで行の値を列として表示する
作成する列がすでにわかっている場合は、以下に示すように、CASEステートメントを使用してピボットテーブルを作成し、MySQLで行の値を列として表示できます。
mysql> 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 |
+------------+------------+-----------+------------+
MySQLで行の値を列として動的に表示する
事前に列名がわからない場合、またはMySQLで行の値を列として動的に表示する場合は、以下に示すように、GROUP_CONCAT関数を使用してMySQLで動的ピボットテーブルを作成できます。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
field_key,
''' then field_value end) ',
field_key
)
) INTO @sql
FROM
Meeting;
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '
FROM Meeting
GROUP BY Meeting_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
GROUP_CONCATを使用すると、field_key値を複数の行から1つの文字列に連結できます。上記のクエリでは、GROUP_CONCATを使用して、 field_key の一意の値に基づいて、CASEステートメントを動的に作成します。 列を作成し、その文字列を@sql変数に格納します。この変数は、選択クエリの作成に使用されます。
+------------+------------+-----------+------------+ | Meeting_id | first_name | last_name | occupation | +------------+------------+-----------+------------+ | 1 | Alec | Jones | engineer | | 2 | John | Doe | engineer | +------------+------------+-----------+------------+
WHERE句またはJOINSを追加することで、要件に応じて上記のクエリをカスタマイズできます。
選択した行の値のみを列として転置する場合は、最初のselectGROUP_CONCATステートメントにWHERE句を追加できます。
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when field_key = ''',
field_key,
''' then field_value end) ',
field_key
)
) INTO @sql
FROM
Meeting
WHERE <condition>;
最終的なピボットテーブルの行をフィルタリングする場合は、SETステートメントにWHERE句を追加できます。
SET @sql = CONCAT('SELECT Meeting_id, ', @sql, '
FROM Meeting WHERE <condition>
GROUP BY Meeting_id');
同様に、MySQLで行の値を列として表示しているときに、SQLクエリにJOINSを適用することもできます。
MySQLで行を列に変換した後、グラフ作成ツールを使用して結果を表にプロットできます。これは、Ubiqを使用して作成されたピボットテーブルの例です。
MySQLデータベースからピボットテーブル、チャート、ダッシュボードを作成する場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。