MySQL Pivot: memutar baris ke kolom

Mysql Pivot Rotating Rows Columns

Tabel database dapat menyimpan berbagai jenis data dan terkadang kita perlu mengubah data tingkat baris menjadi data tingkat kolom. Masalah ini dapat diselesaikan dengan menggunakan fungsi PIVOT(). Fungsi ini digunakan untuk memutar baris tabel menjadi nilai kolom. Tetapi fungsi ini didukung oleh sangat sedikit server database, seperti Oracle atau SQL Server. Jika Anda ingin melakukan tugas yang sama di tabel database MySQL maka Anda harus menulis kueri SELECT menggunakan pernyataan CASE untuk memutar baris menjadi kolom. Artikel ini menunjukkan cara melakukan tugas fungsi PIVOT() dalam tabel database MySQL terkait.

Prasyarat:

Anda harus membuat database dan beberapa tabel terkait di mana baris dari satu tabel akan diubah menjadi kolom seperti fungsi PIVOT(). Jalankan pernyataan SQL berikut untuk membuat database bernama ' unidb ' dan buat tiga tabel bernama ' siswa ',' kursus ' dan ' hasil '. siswa dan hasil tabel akan dihubungkan oleh hubungan satu-ke-banyak dan kursus dan hasil tabel akan terkait dengan hubungan satu-ke-banyak di sini. BUAT pernyataan dari hasil tabel berisi dua batasan kunci asing untuk bidang, std_id , dan kursus_id .



BUAT DATABASE unidb;
GUNAKAN unidb;

BUAT TABEL siswa(
IndoKUNCI UTAMA INT,
nama varchar(lima puluh)TIDAK NULL,
departemen VARCHAR(limabelas)BUKAN NULL);

kursus BUAT TABEL(
course_id VARCHAR(dua puluh)KUNCI UTAMA,
nama varchar(lima puluh)TIDAK NULL,
kredit KECIL BUKAN NULL);

hasil BUAT TABEL(
std_id INT BUKAN NULL,
course_id VARCHAR(dua puluh)TIDAK NULL,
mark_type VARCHAR(dua puluh)TIDAK NULL,
menandai KECIL BUKAN NULL,
KUNCI ASING(std_id)REFERENSI siswa(Indo),
KUNCI ASING(kursus_id)REFERENSI kursus(kursus_id),
KUNCI UTAMA(std_id, course_id, mark_type));

Masukkan beberapa catatan ke dalam siswa, kursus dan hasil tabel. Nilai harus dimasukkan ke dalam tabel berdasarkan batasan yang ditetapkan pada saat pembuatan tabel.



MASUKKAN KE DALAM NILAI siswa
( '1937463','Harper Lee','MTU'),
( '1937464','Garcia Marquez','MTU'),
( '1937465','Forster, E.M.','MTU'),
( '1937466','Ralph Ellison','MTU');

MASUKKAN KE NILAI kursus
( 'CSE-401','Pemrograman berorientasi objek',3),
( 'CSE-403','Struktur data',2),
( 'CSE-407','Pemrograman Unix',2);

MASUKKAN KE NILAI hasil
( '1937463','CSE-401','Ujian Internal',limabelas),
( '1937463','CSE-401','Ujian Tengah Semester',dua puluh),
( '1937463','CSE-401','Ujian akhir',35),
( '1937464','CSE-403','Ujian Internal',17),
( '1937464','CSE-403','Ujian Tengah Semester',limabelas),
( '1937464','CSE-403','Ujian akhir',30),
( '1937465','CSE-401','Ujian Internal',18),
( '1937465','CSE-401','Ujian Tengah Semester',2. 3),
( '1937465','CSE-401','Ujian akhir',38),
( '1937466','CSE-407','Ujian Internal',dua puluh),
( '1937466','CSE-407','Ujian Tengah Semester',22),
( '1937466','CSE-407','Ujian akhir',40);

Di Sini, hasil tabel berisi beberapa nilai yang sama untuk std_id , tanda_tipe dan kursus_id kolom di setiap baris. Cara mengubah baris ini menjadi kolom tabel ini untuk menampilkan data dalam format yang lebih terorganisir ditunjukkan di bagian selanjutnya dari tutorial ini.



Putar baris ke kolom menggunakan pernyataan CASE:

Jalankan pernyataan SELECT sederhana berikut untuk menampilkan semua record dari hasil meja.

PILIH*DARI hasil;

Output menunjukkan nilai empat siswa untuk tiga jenis ujian dari tiga mata kuliah. Jadi nilai std_id , kursus_id dan tanda_tipe diulang beberapa kali untuk siswa yang berbeda, kursus dan jenis ujian.



Output akan lebih mudah dibaca jika query SELECT dapat ditulis lebih efisien dengan menggunakan pernyataan CASE. SELECT berikut dengan pernyataan CASE akan mengubah nilai pengulangan baris menjadi nama kolom dan menampilkan konten tabel dalam format yang lebih mudah dipahami oleh pengguna.

PILIH hasil.std_id, hasil.kursus_id,
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Internal'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian Internal',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Tengah Semester'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian Tengah Semester',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian akhir'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian akhir'
DARI hasil
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

Output berikut akan muncul setelah menjalankan pernyataan di atas yang lebih mudah dibaca daripada output sebelumnya.

Putar baris ke kolom menggunakan CASE dan SUM():

Jika Anda ingin menghitung jumlah total setiap kursus setiap siswa dari tabel, maka Anda harus menggunakan fungsi agregat JUMLAH() kelompok menurut std_id dan kursus_id dengan pernyataan KASUS. Kueri berikut dibuat dengan memodifikasi kueri sebelumnya dengan fungsi SUM() dan klausa GROUP BY.

PILIH result.std_id,result.course_id,
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Internal'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian Internal',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Tengah Semester'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian Tengah Semester',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian akhir'KEMUDIAN hasilnya.tanda SELESAI) 'Ujian akhir',
JUMLAH(result.marks) sebagaiTotal
DARI hasil
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

Output menunjukkan kolom baru bernama Total yaitu menampilkan jumlah nilai semua jenis ujian dari setiap mata kuliah yang diperoleh setiap siswa tertentu.

Putar baris ke kolom dalam beberapa tabel:

Dua kueri sebelumnya diterapkan ke hasil meja. Tabel ini terkait dengan dua tabel lainnya. Ini adalah siswa dan kursus . Jika Anda ingin menampilkan nama siswa alih-alih id siswa dan nama kursus alih-alih id kursus maka Anda harus menulis kueri SELECT menggunakan tiga tabel terkait, siswa , kursus dan hasil . Kueri SELECT berikut dibuat dengan menambahkan tiga nama tabel setelah klausa FORM dan mengatur kondisi yang sesuai dalam klausa WHERE untuk mengambil data dari tiga tabel dan menghasilkan output yang lebih sesuai daripada kueri SELECT sebelumnya.

PILIH siswa.namasebagai ``Nama siswa``, kursus.namasebagai ``Nama kursus``,
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Internal'KEMUDIAN hasilnya.tanda SELESAI) 'CT',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian Tengah Semester'KEMUDIAN hasilnya.tanda SELESAI) 'Pertengahan',
MAKSIMAL(KASUS KETIKA result.mark_type ='Ujian akhir'KEMUDIAN hasilnya.tanda SELESAI) 'Terakhir',
JUMLAH(result.marks) sebagaiTotal
DARI siswa, kursus, hasil
DI MANA result.std_id = siswa.id dan hasil.kursus_id= kursus.kursus_id
GROUP BY result.std_id, result.course_id
ORDER BY result.std_id, result.course_id ASC;

Output berikut akan dihasilkan setelah menjalankan kueri di atas.

Kesimpulan:

Bagaimana Anda bisa mengimplementasikan fungsionalitas fungsi Pivot() tanpa dukungan fungsi Pivot() di MySQL ditunjukkan dalam artikel ini dengan menggunakan beberapa data dummy. Saya harap, para pembaca dapat mengubah data tingkat baris apa pun menjadi data tingkat kolom dengan menggunakan kueri SELECT setelah membaca artikel ini.