Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mysql Konversi Kolom ke baris (Tabel pivot)

Yang perlu Anda lakukan adalah pertama, unpivot data, lalu pivot. Namun sayangnya MySQL tidak memiliki fungsi-fungsi ini sehingga Anda perlu mereplikasinya menggunakan UNION ALL kueri untuk fungsi unpivot dan agregat dengan CASE untuk poros.

Unpivot atau UNION ALL piece mengambil data dari col1, col2, dll dan mengubahnya menjadi beberapa baris:

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

Lihat SQL Fiddle dengan Demo .

Hasil:

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

Anda kemudian membungkus ini dalam subquery untuk menerapkan agregat dan CASE untuk mengonversi ini ke dalam format yang Anda inginkan:

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

Lihat SQL Fiddle dengan demo

Hasilnya adalah:

| 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. Hitung selisih waktu antara dua baris

  2. Masalah dengan karakter UTF-8; apa yang saya lihat bukan apa yang saya simpan

  3. Kesalahan membuat tabel:Anda memiliki kesalahan dalam sintaks SQL Anda di dekat 'order( order_id INT UNSIGNED NOT NULL AUTO_INCREMENT, user_id ' di baris 1

  4. Bagaimana cara menghapus baris mysql setelah waktu berlalu?

  5. Melarikan diri dari kutipan tunggal dalam PHP saat memasukkan ke MySQL