sql >> Database >  >> RDS >> Mysql

Mysql Converteer kolom naar rij (draaitabel)

Wat u moet doen, is eerst de gegevens ongedaan maken en vervolgens draaien. Maar helaas heeft MySQL deze functies niet, dus u zult ze moeten repliceren met een UNION ALL query voor de unpivot en een aggregatiefunctie met een CASE voor de spil.

De unpivot of UNION ALL stuk neemt de gegevens van uw col1, col2, enz. en verandert het in meerdere rijen:

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

Zie SQL Fiddle met demo .

Resultaat:

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

U verpakt dit vervolgens in een subquery om de aggregatie en de CASE . toe te passen om dit naar het gewenste formaat te converteren:

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

Zie SQL Fiddle met demo

Het resultaat is:

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


  1. Pg_dump gebruiken om alleen insert-instructies uit één tabel binnen de database te krijgen

  2. Hoe DateTime naar VarChar . te converteren

  3. MariaDB Cluster 10.5 implementeren voor hoge beschikbaarheid

  4. ORA-01861:letterlijk komt niet overeen met opmaaktekenreeks