sql >> Database teknologi >  >> RDS >> Mysql

Mysql Konverter kolonne til række (pivottabel)

Det, du skal gøre, er først at fjerne pivotering af dataene og derefter pivotere dem. Men desværre har MySQL ikke disse funktioner, så du bliver nødt til at replikere dem ved hjælp af en UNION ALL forespørgsel til unpivot og en aggregeret funktion med en CASE for pivoten.

Unpivot eller UNION ALL piece tager dataene fra din col1, col2 osv. og omdanner dem til flere rækker:

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
 

Se SQL Fiddle with Demo .

Resultat:

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

Du pakker derefter dette ind i en underforespørgsel for at anvende aggregatet og CASE for at konvertere dette til det ønskede format:

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
 

Se SQL Fiddle with demo

Resultatet er:

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

  1. Brug af LogMiner til at finde aktuelle ændringer

  2. Syntaksfejl på grund af brug af et reserveret ord som et tabel- eller kolonnenavn i MySQL

  3. I SQL Server, hvordan man pivoterer for flere kolonner

  4. Statisk og dynamisk datamaskering i FieldShield