これは基本的にPIVOT
(RDBMSを指定していません)MySQLを想定しており、関数がないため、ステートメントPIVOT
を含む集計関数を使用してこれを複製する必要があります。CASE
このソリューションはrownumber
各行にを追加するため、name
列に変換する必要のある値の数を決定できます。
取得する値の数がわかっている場合name
は、値をハードコーディングできます。
select plantid,
max(case when nameRn = 'name1' then name end) Name1,
max(case when nameRn = 'name2' then name end) Name2,
max(case when nameRn = 'name3' then name end) Name3
from
(
select plantid, name,
concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
@plantid := `plantid` as dummy
from
(
select plantid, name, @rn:=@rn+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
) x
order by plantid, overall_row_num
) src
group by plantid;
SQL FiddlewithDemoを参照してください
値の数が不明な場合は、プリペアドステートメントを使用して、次の動的バージョンを生成できます。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when nameRn = ''',
nameRn,
''' then name end) AS ',
nameRn
)
) INTO @sql
FROM
(
select plantid, name,
concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
@plantid := `plantid` as dummy
from
(
select plantid, name, @rn:=@rn+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
) x
order by plantid, overall_row_num
) src;
SET @sql = CONCAT('SELECT plantid, ', @sql, '
FROM
(
select plantid, name,
concat(''name'', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
@plantid := `plantid` as dummy
from
(
select plantid, name, @rn:=@rn+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
) x
order by plantid, overall_row_num
) src
GROUP BY plantid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SQL FiddlewithDemoを参照してください
どちらも同じ結果を生成します。
| PLANTID | NAME1 | NAME2 | NAME3 |
-------------------------------------
| 1 | tree | rose | (null) |
| 2 | bush | (null) | (null) |
| 3 | tree | bush | rose |