行から列へのこのタイプの変換は、ピボットと呼ばれます。MySQL にはピボット関数がありませんが、これはCASE
式を含む集計関数を使用して複製できます。
以下を使用できます。
select
max(case when element_label = 'Name' then element_value end) Name,
max(case when element_label = 'Address' then element_value end) Address,
max(case when element_label = 'State' then element_value end) State,
max(case when element_label = 'City' then element_value end) City,
max(case when element_label = 'Zip' then element_value end) Zip
from yt
SQL Fiddle with Demoを参照してください。
列に変換する値の数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成できます。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN element_label = ''',
element_label,
''' THEN element_value else null END) AS `',
element_label, '`'
)
) INTO @sql
FROM yt;
SET @sql
= CONCAT('SELECT ', @sql, '
from yt
');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SQL Fiddle with Demoを参照してください。両方のクエリの結果は次のとおりです。
| NAME | ADDRESS | CITY | STATE | ZIP |
----------------------------------------------------------
| John Smith | 100 Elm Street | Columbus | Ohio | 13579 |
通常、グループ化する列もあります。たとえば、record_id 列がある場合、 を追加するとGROUP BY record_id
、複数の結果行が返されます。