sql >> Databáze >  >> RDS >> Mysql

Mysql Převést sloupec na řádek (kontingenční tabulka)

Co musíte udělat, je nejprve uvolnit data a poté je otočit. MySQL bohužel tyto funkce nemá, takže je budete muset replikovat pomocí UNION ALL dotaz na unpivot a agregační funkci pomocí CASE pro pivot.

Unpivot nebo UNION ALL kus převezme data z vašich sloupců1, sloupců2 atd. a převede je do několika řádků:

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

Viz SQL Fiddle s ukázkou .

Výsledek:

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

Poté to zabalíte do dílčího dotazu, abyste použili agregaci a CASE pro převod do požadovaného formátu:

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

Viz SQL Fiddle s ukázkou

Výsledek je:

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


  1. PostgreSql INSERT FROM SELECT VRACOVACÍ ID

  2. Je možné migrovat z Realmu do Sqlite?

  3. Jak na to:Vyčistit mysql úložiště InnoDB?

  4. Zjednodušte vnořený příkaz case when