まず、データのピボットを解除してからピボットする必要があります。残念ながら、MySQL にはこれらの関数がないため、アンピボットUNION ALL
用のクエリとCASE
ピボット用の集計関数を使用して複製する必要があります。
アンピボットまたはUNION ALL
ピースは、col1、col2 などからデータを取得し、複数の行に変換します。
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
SQL Fiddle with Demoを参照してください。
結果:
| 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 |
次に、これをサブクエリでラップして集計を適用し、CASE
これを必要な形式に変換します。
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
デモで SQL Fiddle を参照してください
結果は次のとおりです。
| DESCRIP | JAN | FEB |
-----------------------
| col1 | A | C |
| col2 | B | A |
| col3 | 0 | G |
| col4 | B | E |