Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Memahami Pernyataan PIVOT, UNPIVOT, dan PIVOT Terbalik

Pernyataan PIVOT digunakan untuk mengubah baris tabel menjadi kolom, sedangkan operator UNPIVOT mengubah kolom kembali menjadi baris. Membalikkan pernyataan PIVOT mengacu pada proses penerapan operator UNPIVOT ke kumpulan data yang sudah PIVOTED untuk mengambil kumpulan data asli.

Dalam artikel ini, kita akan mempelajari ketiga konsep tersebut dengan contoh yang berbeda.

Operator PIVOT

Seperti disebutkan sebelumnya, operator PIVOT mengubah baris tabel menjadi kolom. Misalnya, jika Anda memiliki tabel yang terlihat seperti ini:

dan putar di kolom ketiga, hasilnya akan seperti berikut:

Di tabel asli, kami memiliki dua nilai unik untuk kolom Kursus – Bahasa Inggris dan Sejarah. Di tabel berporos, nilai unik ini telah diubah menjadi kolom. Anda dapat melihat bahwa nilai skor untuk setiap kolom baru tetap tidak berubah. Misalnya, di tabel asli, seorang siswa, Sally, mendapat skor 95 dalam bahasa Inggris, tidak seperti nilai di tabel pivot.

Seperti biasa, pastikan Anda membuat cadangan yang aman sebelum melakukan penyesuaian apa pun pada database langsung.

Mari kita lihat contoh penggunaan operator PIVOT di SQL Server.

CREATE DATABASE School
GO

USE School
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Course VARCHAR (50),
	Score INT
)
GO

INSERT INTO Students VALUES ('Sally', 'English', 95 )
INSERT INTO Students VALUES ('Sally', 'History', 82)
INSERT INTO Students VALUES ('Edward', 'English', 45)
INSERT INTO Students VALUES ('Edward', 'History', 78)

Script di atas membuat database Sekolah. Dalam database, kami membuat tabel Siswa dengan empat kolom, seperti Id, StudentName, Course, dan Score. Terakhir, kami menambahkan empat catatan dummy ke tabel Siswa.

Sekarang, jika Anda menggunakan pernyataan SELECT untuk mengambil semua catatan, Anda akan melihat yang berikut:

Mari PIVOT tabel ini dengan kolom Kursus. Untuk melakukannya, jalankan skrip berikut:

SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot

Mari kita lihat apa yang terjadi dalam skrip. Pada baris pertama, kita menggunakan pernyataan SELECT untuk mendefinisikan kolom yang ingin kita tambahkan ke tabel pivot. Dua kolom pertama adalah StudentName dan Score. Data untuk kedua kolom ini akan datang langsung dari tabel Siswa. Kolom ketiga adalah Kursus. Kami ingin PIVOT tabel kami dengan kolom Kursus, oleh karena itu, kolom Kursus akan dibagi menjadi jumlah kolom yang sama dengan nilai yang ditentukan oleh operator PIVOT untuk kolom Kursus.

Sintaks untuk operator PIVOT sederhana. Pertama, Anda harus menerapkan fungsi agregat ke kolom yang nilainya ingin Anda tampilkan di kolom berporos. Dalam kasus kami, kami ingin menampilkan Skor di kolom pivot – Bahasa Inggris dan Sejarah. Terakhir, kami menggunakan pernyataan FOR untuk menentukan kolom pivot dan nilai unik di dalamnya. Hasilnya terlihat seperti ini:

Operator UNPIVOT

Operator UNPIVOT digunakan untuk mengubah kolom tabel menjadi baris. Misalnya, jika Anda memiliki tabel yang terlihat seperti ini:

Operator UNPIVOT akan mengembalikan hasil berikut:

Kolom dari tabel asli telah dikonversi ke baris dalam tabel yang tidak dipivot. Mari gunakan data tersebut untuk melihat cara kerja operator UNPIVOT di SQL.

Untuk melakukannya, jalankan skrip berikut:

CREATE DATABASE School2
GO

USE School2
GO

CREATE TABLE Students
(
	Id INT PRIMARY KEY IDENTITY,
	StudentName VARCHAR (50),
	Math INT,
	English INT,
	History INT,
	Science INT
)
GO

INSERT INTO Students VALUES ('Sally', 78, 85, 91, 76 )
INSERT INTO Students VALUES ('Edward', 87, 90, 82, 87)

Jika Anda memilih data dari tabel Siswa dari database School2, Anda akan melihat hasil berikut:

Untuk menerapkan operator UNPIVOT ke tabel ini, jalankan kueri berikut:

SELECT StudentName, Course, Score
FROM Students
UNPIVOT
(
	Score
	FOR Course in (Math, English, History, Science)
) AS SchoolUnpivot

Sintaks untuk operator UNPIVOT mirip dengan yang PIVOT. Dalam pernyataan SELECT, Anda perlu menentukan kolom yang ingin Anda tambahkan ke tabel output. Dalam pernyataan UNPIVOT, Anda akan menentukan dua kolom:

  1. Kolom pertama berisi nilai dari baris kolom yang diputar (yang dalam hal ini adalah Skor).
  2. Kolom kedua berisi nama-nama kolom berporos, yaitu Matematika, Bahasa Inggris, Sejarah, dan Sains.

Tabel output akan terlihat seperti ini:

Membalikkan PIVOT

Pembalikan operator PIVOT mengacu pada proses penerapan operator UNPIVOT ke tabel pivot untuk kembali ke tabel aslinya.

Membalikkan Tabel Pivot Non-agregat

Pembalikan operator PIVOT hanya dimungkinkan jika tabel pivot tidak berisi data gabungan.

Mari kita lihat tabel yang kita gunakan di bagian PIVOT artikel ini.

Anda dapat melihat bahwa tidak ada baris yang berulang. Dengan kata lain, kita dapat mengatakan bahwa untuk setiap siswa hanya ada satu catatan per mata pelajaran. Misalnya, Sally hanya memiliki satu rekor untuk skornya dalam kursus bahasa Inggris.

Ketika kami menerapkan operator PIVOT ke tabel di atas, kami mendapatkan hasil sebagai berikut:

Sekarang, kita akan menerapkan operator UNPIVOT ke hasil ini dan melihat apakah kita bisa kembali ke tabel aslinya. Untuk melakukannya, jalankan skrip berikut:

Catatan:

Kita dapat mengeksekusi query ini pada database Sekolah yang kita buat di bagian operator PIVOT.

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Di sini kita menggunakan subquery untuk menerapkan operator UNPIVOT ke data pivot. Kueri dalam menggunakan operator PIVOT, sedangkan kueri luar menggunakan operator UNPIVOT. Pada output, Anda akan melihat tabel Siswa asli.

Membalikkan Tabel Pivoted Gabungan

Kami mengatakan sebelumnya bahwa hanya mungkin untuk membalikkan operator PIVOT yang tidak berisi data agregat. Mari kita coba membalik pernyataan PIVOT yang berisi data agregat.

Tambahkan catatan lain ke tabel Siswa dari database Sekolah yang kami buat di bagian pertama artikel ini. Untuk melakukannya, jalankan kueri berikut:

INSERT INTO Students VALUES ('Edward', 'History', 78)

Sekarang, jika Anda memilih semua record dari tabel Students, Anda akan mendapatkan output berikut:

Kami dapat melihat bahwa kami memiliki catatan duplikat untuk skor Edward di History.

Sekarang, terapkan operator PIVOT ke tabel ini.

SELECT Id, StudentName, English, History
FROM Students
PIVOT
(
	SUM (Score)
	FOR Course in (English, History)
) AS Schoolpivot

Dari output tersebut terlihat bahwa fungsi SUM pada operator PIVOT telah menambahkan dua nilai pada mata kuliah History yang diambil oleh Edward. Jika Anda mencoba membalikkan pivot tabel ini (yaitu menerapkan operator UNPIVOT), Anda tidak akan menerima tabel asli. Ini akan mengembalikan empat catatan, bukan lima asli. Kolom Riwayat untuk siswa Edward akan berisi hasil gabungan, bukan hasil individual.

Untuk melihatnya, jalankan skrip berikut:

SELECT StudentName, Course, Score
FROM
(SELECT * FROM
 
(SELECT 
	StudentName,
	Score,
	Course
FROM 
	Students
)
AS StudentTable
PIVOT(
	SUM(Score)
	FOR Course IN ([English],[History])
) AS SchoolPivot) PivotedResults
UNPIVOT
(
	Score
	FOR Course in (English, History)
) AS Schoolunpivot

Tabel output akan terlihat seperti ini:

Referensi:

  • Microsoft:Menggunakan PIVOT dan UNPIVOT
  • Codingsight:Menggunakan PIVOT di SQL
  • YouTube:Membalikkan video PIVOT

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menghapus kolom dalam tabel

  2. Dasar-dasar ekspresi tabel, Bagian 3 – Tabel turunan, pertimbangan pengoptimalan

  3. Cara Menulis Query Kompleks di SQL

  4. 30 Pertanyaan Wawancara Kueri SQL Teratas yang Harus Anda Latih Pada 2022

  5. Mencari Penyimpanan Lokal Cepat