これは基本的にはですPIVOT
が、MySQL には関数がないため、集計関数PIVOT
を含むステートメントを使用して複製できます。CASE
値の数がわかっている場合は、type
値をハードコーディングできます。
select year,
avg(case when type='A' then price end) PriceA,
avg(case when type='B' then price end) PriceB
from yourtable
group by year
デモで SQL Fiddle を参照してください
結果:
| YEAR | PRICEA | PRICEB |
--------------------------
| 1999 | (null) | 100 |
| 2002 | 200 | 120 |
| 2004 | 202 | (null) |
| 2005 | 206 | (null) |
不明な数がある場合はtypes
、準備済みステートメントを使用できます。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'avg(case when type = ''',
type,
''' then price end) AS Price',
type
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT year, ', @sql, '
FROM yourtable
GROUP BY year');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
デモで SQL Fiddle を参照してください