Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql Converter coluna em linha (tabela dinâmica)


O que você precisa fazer é primeiro, desdinamizar os dados e, em seguida, dinamizá-los. Mas infelizmente o MySQL não tem essas funções então você precisará replicá-las usando um UNION ALL consulta para o unpivot e uma função agregada com um CASE para o pivô.

O unpivot ou UNION ALL piece pega os dados do seu col1, col2, etc e os transforma em várias linhas:
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

Consulte SQL Fiddle with Demo .

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

Você então envolve isso em uma subconsulta para aplicar a agregação e o CASE para converter isso no formato desejado:
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

Consulte SQL Fiddle com demonstração

O resultado é:
| DESCRIP | JAN | FEB |
-----------------------
|    col1 |   A |   C |
|    col2 |   B |   A |
|    col3 |   0 |   G |
|    col4 |   B |   E |