Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysql Spalte in Zeile konvertieren (Pivot-Tabelle)

Was Sie tun müssen, ist zuerst, die Daten zu entpivotieren und sie dann zu pivotieren. Aber leider hat MySQL diese Funktionen nicht, also müssen Sie sie mit einem UNION ALL replizieren Abfrage für das Unpivot und eine Aggregatfunktion mit einem CASE für den Pivot.

Das Unpivot oder UNION ALL piece nimmt die Daten von col1, col2 usw. und wandelt sie in mehrere Zeilen um:

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

Siehe SQL-Fiddle mit Demo .

Ergebnis:

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

Sie schließen dies dann in eine Unterabfrage ein, um das Aggregat und den CASE anzuwenden um diese in das gewünschte Format umzuwandeln:

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

Siehe SQL Fiddle mit Demo

Das Ergebnis ist:

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