sql >> Databasteknik >  >> RDS >> Mysql

Mysql Konvertera kolumn till rad (pivottabell)

Vad du behöver göra är att först avpivotera data och sedan pivotera den. Men tyvärr har MySQL inte dessa funktioner så du måste replikera dem med en UNION ALL fråga för unpivoten och en aggregatfunktion med en CASE för pivoten.

Unpivoten eller UNION ALL piece tar data från din col1, col2, etc och gör om den till flera rader:

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-fiol med 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 lindar sedan in detta i en underfråga för att tillämpa aggregatet och CASE för att konvertera detta till det format du vill ha:

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-fiol med demo

Resultatet är:

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


  1. Gör ett objekt DÖ i SQL Server

  2. mysqli or die, måste den dö?

  3. Hur sammanfogar man många rader med samma id i sql?

  4. Fördelarna med PostgreSQL