Operator pivot di SQL Server mengonversi setiap baris dalam kumpulan hasil agregat menjadi kolom yang sesuai di kumpulan keluaran. Operator pivot sangat berguna dalam menulis kueri tabulasi silang.
Mari kita lihat cara kerjanya dalam praktik.
Menyiapkan Data
Pertama, mari kita buat beberapa data dummy yang kemudian dapat kita gunakan untuk mengimplementasikan operator pivot.
CREATE DATABASE schooldb
CREATE TABLE student
(
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
gender VARCHAR(50) NOT NULL,
DOB datetime NOT NULL,
total_score INT NOT NULL,
city VARCHAR(50) NOT NULL
)
INSERT INTO student
VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500, 'London'),
(2, 'Jon', 'Male', '02-FEB-1974', 545, 'Manchester'),
(3, 'Sara', 'Female', '07-MAR-1988', 600, 'Leeds'),
(4, 'Laura', 'Female', '22-DEC-1981', 400, 'Liverpool'),
(5, 'Alan', 'Male', '29-JUL-1993', 500, 'London'),
(6, 'Kate', 'Female', '03-JAN-1985', 500, 'Liverpool'),
(7, 'Joseph', 'Male', '09-APR-1982', 643, 'London'),
(8, 'Mice', 'Male', '16-AUG-1974', 543, 'Liverpool'),
(9, 'Wise', 'Male', '11-NOV-1987', 499, 'Manchester'),
(10, 'Elis', 'Female', '28-OCT-1990', 400, 'Leeds');
Bagaimana Cara Kerja Operator Pivot?
Cara standar untuk mengelompokkan data SQL adalah dengan menggunakan klausa Group By. Mari buat kueri yang menghitung rata-rata nilai di kolom total_score tabel siswa, yang dikelompokkan menurut kota.
USE schooldb
SELECT
city,
AVG(total_score) as Avg_Score
FROM
student
GROUP BY
city
Ini memberikan hasil berikut:
[id tabel=25 /]
Bagaimana jika kita ingin hasil yang ditetapkan di mana nama kota ditampilkan di kolom di mana setiap kolom berisi nilai rata-rata dari total_score siswa yang termasuk dalam kota itu? Sesuatu seperti ini:
[id tabel=26 /]
Di sinilah operator pivot berguna.
Memilih Data Dasar
Langkah pertama saat menggunakan operator pivot adalah memilih data dasar yang akan menjadi basis operator pivot. Kami ingin mengelompokkan data kami berdasarkan kota dan menemukan rata-rata dari total_skor siswa yang termasuk dalam kota itu. Oleh karena itu, kita perlu menulis pernyataan SELECT sederhana yang memilih kota dan total_score.
SELECT
city,
total_score
FROM
student
Membuat Kumpulan Data Sementara
Sekarang, idealnya, kita bisa langsung menerapkan operator pivot pada data dasar yang kita buat di bagian sebelumnya, tapi sayangnya tidak bisa. Agar operator pivot berfungsi, kita harus membuat ekspresi bernilai tabel yang dapat kita terapkan pada operator pivot. Kami memiliki berbagai pilihan di sini; kita bisa menggunakan tabel turunan, ekspresi tabel umum (CTE) atau kita bahkan bisa membuat tabel sementara.
Untuk contoh ini, kita akan menggunakan tabel turunan yang cepat dan sederhana. Untuk melakukannya dengan pernyataan pilih dasar yang kami buat di bagian terakhir, kami membungkusnya dalam satu set tanda kurung dan kemudian menerapkan alias untuk itu. Akhirnya, kami memilih semuanya dari tabel turunan itu.
SELECT * FROM
(SELECT
city,
total_score
FROM
student
)
AS StudentTable
Menerapkan Operator Pivot
Sekarang setelah kita menyiapkan data dasar dan membuat tabel turunan, kita akan menerapkan operator pivot ke dalamnya.
Untuk melakukannya, sisipkan “PIVOT” di akhir tabel turunan, diikuti dengan serangkaian tanda kurung, dan berikan alias pada tabel pivot ini.
Di dalam kurung, kita harus menentukan beberapa informasi penting.
- Kita perlu menentukan bidang yang ingin kita terapkan fungsi agregatnya. Dalam kasus kami, kami ingin menerapkan fungsi agregat AVG di kolom “total_score”.
- Kemudian kita harus mengatakan kolom mana dari data dasar tempat kita memutar data. Kami melakukannya dengan menulis “UNTUK” diikuti dengan nama kolom yang merupakan kota dalam contoh kami.
- Langkah terakhir sedikit menjengkelkan. Kita harus membuat daftar nilai dari kolom kota yang ingin kita jadikan heading di tabel pivot kita. Kami menggunakan operator IN diikuti oleh satu set tanda kurung. Di dalam tanda kurung, kami menggunakan daftar yang dipisahkan koma di mana kami menulis nama setiap kolom di dalam tanda kurung siku. Dalam contoh kita, kita menginginkan London, Leeds, dan Manchester sebagai nama heading dari tabel pivot dan kita menulisnya dalam format ini:([London], [Leeds], [Manchester]).
USE schooldb
SELECT * FROM
(SELECT
city,
total_score
FROM
student
)
AS StudentTable
PIVOT(
AVG(total_score)
FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable
Jika Anda menjalankan kueri di atas, hasilnya akan terlihat seperti ini:
[id tabel=27 /]
Menambahkan Grup Baris di Tabel Pivot
Di bagian sebelumnya, kita melihat bagaimana mengubah grup baris menjadi grup kolom menggunakan operator pivot. Namun, Anda juga dapat menambahkan grup baris bersama dengan grup kolom ke dalam tabel pivot.
Misalnya, jika Anda ingin mencari nilai rata-rata kolom total_score dari semua siswa yang dikelompokkan menurut kota dan juga jenis kelamin, Anda dapat menggunakan grup kolom dan grup baris bersama-sama di dalam tabel pivot. Di sini setiap kolom akan mewakili nama kota dan setiap baris akan mewakili jenis kelamin siswa.
Untungnya, Anda tidak perlu menulis skrip tambahan untuk menambahkan grup baris ke tabel pivot. Di dalam kumpulan data dasar, cukup tambahkan nama kolom yang ingin Anda tambahkan sebagai grup baris ke tabel pivot.
USE schooldb
SELECT * FROM
(SELECT
city,
gender,
total_score
FROM
student
)
AS StudentTable
PIVOT(
AVG(total_score)
FOR city IN ([London],[Liverpool],[Leeds],[Manchester])
) AS StudentPivotTable
Dalam skrip di atas, kami hanya menambahkan kolom “gender” di pernyataan SELECT dasar.
Output dari query di atas terlihat seperti ini:
[id tabel=28 /]
Ini adalah tabulasi silang. Sebagai contoh, dapat dilihat dari hasil bahwa rata-rata total_score siswa perempuan yang tinggal di London adalah 500. Demikian pula, rata-rata total skor siswa laki-laki yang tinggal di London adalah 571.
Baca juga:
Membuat Tabel Pivot Dinamis dengan Fungsi QUOTENAME