Co musíte udělat, je nejprve uvolnit data a poté je otočit. MySQL bohužel tyto funkce nemá, takže je budete muset replikovat pomocí UNION ALL
dotaz na unpivot a agregační funkci pomocí CASE
pro pivot.
Unpivot nebo UNION ALL
kus převezme data z vašich sloupců1, sloupců2 atd. a převede je do několika řádků:
select id, month, col1 value, 'col1' descrip
from yourtable
union all
select id, month, col2 value, 'col2' descrip
from yourtable
union all
select id, month, col3 value, 'col3' descrip
from yourtable
union all
select id, month, col4 value, 'col4' descrip
from yourtable
Viz SQL Fiddle s ukázkou .
Výsledek:
| ID | MONTH | VALUE | DESCRIP |
----------------------------------
| 101 | Jan | A | col1 |
| 102 | feb | C | col1 |
| 101 | Jan | B | col2 |
| 102 | feb | A | col2 |
| 101 | Jan | (null) | col3 |
| 102 | feb | G | col3 |
| 101 | Jan | B | col4 |
| 102 | feb | E | col4 |
Poté to zabalíte do dílčího dotazu, abyste použili agregaci a CASE
pro převod do požadovaného formátu:
select descrip,
max(case when month = 'jan' then value else 0 end) jan,
max(case when month = 'feb' then value else 0 end) feb
from
(
select id, month, col1 value, 'col1' descrip
from yourtable
union all
select id, month, col2 value, 'col2' descrip
from yourtable
union all
select id, month, col3 value, 'col3' descrip
from yourtable
union all
select id, month, col4 value, 'col4' descrip
from yourtable
) src
group by descrip
Výsledek je:
| DESCRIP | JAN | FEB |
-----------------------
| col1 | A | C |
| col2 | B | A |
| col3 | 0 | G |
| col4 | B | E |