Per ottenere il risultato che desideri, dovrai entrambi reimpostare il pivot i dati correnti dalle colonne in righe e quindi ruota l'year
dati da righe a colonne.
MySQL non ha una funzione PIVOT o UNPIVOT, quindi dovrai usare un UNION ALL
query per annullare il pivot e una funzione aggregata con un CASE
espressione da ruotare.
Se hai un numero noto di valori, puoi codificare valori simili a questo:
select locid,
event,
max(case when year = 2011 then value end) `2011`,
max(case when year = 2012 then value end) `2012`
from
(
select LocId, Year, 'Birth' event, Birth value
from yt
union all
select LocId, Year, 'Death' event, Death value
from yt
union all
select LocId, Year, 'Abc' event, Abc value
from yt
) d
group by locid, event;
Vedi SQL Fiddle con demo .
Ma se hai un numero sconosciuto di valori, dovrai utilizzare un'istruzione preparata per generare SQL dinamico. Il codice sarà simile al seguente:
SET @sql = NULL;
SET @sqlUnpiv = NULL;
SET @sqlPiv = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'select locid, year, ''',
c.column_name,
''' as event, ',
c.column_name,
' as value
from yt '
) SEPARATOR ' UNION ALL '
) INTO @sqlUnpiv
FROM information_schema.columns c
where c.table_name = 'yt'
and c.column_name not in ('LocId', 'Year')
order by c.ordinal_position;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN year = ',
year,
' THEN value else null END) AS `',
year, '`'
)
) INTO @sqlPiv
FROM yt;
SET @sql
= CONCAT('SELECT locid,
event, ', @sqlPiv, '
from
( ', @sqlUnpiv, ' ) d
group by locid, event');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Vedi SQL Fiddle con demo . Il risultato per entrambe le query è:
| LOCID | EVENT | 2011 | 2012 |
-------------------------------
| 1 | Abc | 10 | 20 |
| 1 | Birth | 100 | 98 |
| 1 | Death | 60 | 70 |