Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql Convertir une colonne en ligne (tableau croisé dynamique)

Ce que vous devez faire, c'est d'abord défaire pivoter les données, puis les faire pivoter. Mais malheureusement MySQL n'a pas ces fonctions donc vous devrez les répliquer en utilisant un UNION ALL requête pour l'unpivot et une fonction d'agrégation avec un CASE pour le pivot.

L'unpivot ou UNION ALL piece prend les données de votre col1, col2, etc. et les transforme en plusieurs lignes :

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

Voir SQL Fiddle avec démo .

Résultat :

|  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 |

Vous encapsulez ensuite cela dans une sous-requête pour appliquer l'agrégat et le CASE pour convertir ceci dans le format que vous voulez :

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

Voir SQL Fiddle avec démo

Le résultat est :

| DESCRIP | JAN | FEB |
-----------------------
|    col1 |   A |   C |
|    col2 |   B |   A |
|    col3 |   0 |   G |
|    col4 |   B |   E |