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.