Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mysql Konwertuj kolumnę na wiersz (tabela przestawna)

To, co musisz zrobić, to najpierw przestawić dane, a następnie je przestawić. Ale niestety MySQL nie ma tych funkcji, więc będziesz musiał je zreplikować za pomocą UNION ALL zapytanie o unpivot i funkcję agregującą z CASE dla osi.

Unpivot lub UNION ALL piece pobiera dane z col1, col2 itd. i zamienia je w wiele wierszy:

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

Zobacz Skrzypce SQL z wersją demonstracyjną .

Wynik:

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

Następnie owijasz to w podzapytanie, aby zastosować agregację i CASE aby przekonwertować to na żądany 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

Zobacz SQL Fiddle z demonstracją

Wynik:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak naprawić:Nie znaleziono odpowiedniego sterownika dla błędu jdbc:mysql://localhost/dbname podczas korzystania z pul?

  2. Jak stworzyć bloga w PHP i bazie danych MySQL - projektowanie DB

  3. Błąd migracji Laravel:błąd składni lub naruszenie dostępu:1071 Podany klucz był za długi; maksymalna długość klucza to 767 bajtów

  4. Ustaw PDO, aby domyślnie zgłaszało wyjątki

  5. Jak obliczyć różnicę między dwoma znacznikami czasu w MySQL?