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

kueri untuk tata letak horizontal data mysql

Yang Anda butuhkan adalah kueri Pivot. Karena MySQL tidak memiliki pernyataan untuk itu, Anda harus menulisnya "dengan tangan" (lebih tepatnya, buat ekspresi SQL dinamis):

Jadi, mungkin seperti ini:

-- First you need to build the column list.
-- The "CASE ... END" expression will filter the data for each column
-- I use "max()" as an example; use whatever aggregate function you need.
select
  group_concat(distinct
    concat(
      'max(case when del_ProductID = ', del_productID, ' then del_id end) ',
      'as `del_productID-', del_productID, '` '
    )
  )
into @sql
from example;

-- Now build the full SELECT statement
set @sql = concat('SELECT del_date, ', @sql, ' from example group by del_date');


-- OPTIONAL: Check the SELECT statement you've just built
select @sql;

-- Prepare a statement using the SELECT statement built above
prepare stmt from @sql;
execute stmt;

-- When you are done, be sure to dealocate the prepared statement
deallocate prepare stmt;

Silakan lihat contoh ini di SQL fiddle .

Penjelasan

Anda mungkin berkata "bung, ini terlihat cukup rumit!"... tapi itu tidak rumit sama sekali (hanya melelahkan). Jadi, bagaimana cara kerja solusi di atas?

Langkah pertama adalah membuat daftar kolom dan ekspresi untuk mengisinya. group_concat() function akan mengambil nilai baris (atau ekspresi) dan menggabungkannya, memisahkannya dengan koma. Anda memerlukan fungsi agregat untuk menampilkan nilai dalam hasil tabel pivot. Saya memilih max() sebagai contoh, tetapi Anda dapat menggunakan sum() , average() atau fungsi agregat lainnya.

Adapun kasus case ... end bagian di dalam fungsi agregat, Anda memerlukan bahwa setiap kolom tabel pivot cocok dengan nilai del_productID , jadi, misalnya, case when del_ProductID = 1 then del_id end akan mengembalikan nilai del_id hanya jika del_ProductID adalah 1 (akan mengembalikan null dalam kasus lain, Anda dapat menambahkan else 0 jika Anda ingin mengembalikan nol, misalnya).

select ... into akan menyimpan hasil ekspresi ke dalam variabel bernama @sql .

Setelah Anda membuat daftar kolom, Anda perlu menulis sisa select pernyataan... yang dilakukan dengan concat() fungsi.

Adapun sisanya, cukup mudah:@sql adalah string, jadi jika Anda ingin menjalankannya, Anda perlu membuat pernyataan yang disiapkan menggunakan nilainya (yaitu select pernyataan), dan jalankan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Transaksi MySQL:SELECT + INSERT

  2. Kerangka Ketersediaan Tinggi MySQL Dijelaskan – Bagian I:Pendahuluan

  3. Bagaimana Memperbaiki Masalah Umum dengan Database MySQL?

  4. Permintaan Django raw(), bidang terhitung dalam klausa WHERE

  5. Mysql Bandingkan dua bidang datetime