Sintaks PIVOT dan Crosstab Vendor
PIVOT di SQL Server dan crosstab di Postgres, beserta keterbatasannya.
Sintaks PIVOT dan Crosstab Vendor adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Di Luar Agregasi Kondisional
Anda sudah mengetahui pivot CASE yang kompatibel lintas sistem. Namun, pewawancara juga ingin mengetahui apakah Anda dapat menggunakan operator pivot khusus produk ketika tersedia.
SQL Server menyediakan operator PIVOT khusus. PostgreSQL menyediakan fungsi crosstab dalam ekstensi tablefunc. Mengetahui keduanya beserta sisi-sisi yang perlu diwaspadai menunjukkan pengalaman di dunia nyata.
Anatomi PIVOT di SQL Server
PIVOT SQL Server menerima tiga hal:
- Agregat atas kolom nilai.
- Klausa
FORyang menamai kolom yang nilainya menjadi kolom baru. - Daftar
INberisi nilai yang akan diubah menjadi kolom.
Operator ini harus diterapkan pada tabel turunan yang hanya menampilkan kunci, kolom penyebar, dan nilai—tidak lebih.
SELECT region, [Q1], [Q2]
FROM (SELECT region, quarter, amount FROM sales) AS src
PIVOT (
SUM(amount)
FOR quarter IN ([Q1], [Q2])
) AS p;GROUP BY Implisit
Jebakan halus pada PIVOT yang diujikan pewawancara: pengelompokan dilakukan secara implisit. SQL Server mengelompokkan berdasarkan setiap kolom dalam sumber yang BUKAN kolom agregat atau kolom FOR.
Jadi, jika tabel turunan Anda tidak sengaja menyertakan kolom tambahan seperti order_id, pivot juga mengelompokkannya dan Anda mendapatkan jauh lebih banyak baris daripada yang diharapkan. Selalu batasi kueri bagian dalam hanya pada kunci, kolom penyebar, dan nilai.
-- WRONG: order_id leaks in and breaks grouping
FROM (SELECT region, quarter, amount, order_id FROM sales) AS src
PIVOT (SUM(amount) FOR quarter IN ([Q1],[Q2])) AS p;
-- The pivot now groups by region AND order_idNama Kolom dalam Kurung Siku
Di SQL Server, nama kolom yang diputar adalah nilai literal dari data, yang dibungkus dalam kurung siku. Jika suatu nilai diawali angka atau mengandung spasi, kurung siku wajib digunakan.
Anda memilihnya menggunakan nama yang sama dalam kurung siku pada SELECT bagian luar. Inilah juga alasan PIVOT tidak dapat menangani nilai yang tidak diketahui tanpa SQL dinamis: daftar IN ditulis secara tetap.
SELECT region, [2023], [2024]
FROM (SELECT region, yr, amount FROM sales) AS s
PIVOT (SUM(amount) FOR yr IN ([2023], [2024])) AS p;crosstab PostgreSQL
PostgreSQL tidak memiliki kata kunci PIVOT. Sebagai gantinya, ekstensi tablefunc menyediakan crosstab, sebuah fungsi yang menerima teks SQL dan mengubah bentuk outputnya.
Anda harus mengaktifkan ekstensi tersebut terlebih dahulu. crosstab mengharapkan kueri sumber mengembalikan tepat tiga kolom: pengenal baris, kategori, dan nilai, dalam urutan tersebut.
CREATE EXTENSION IF NOT EXISTS tablefunc;
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);Daftar Definisi Kolom
Bagian crosstab yang paling rentan terhadap kesalahan adalah daftar definisi kolom AS ct(...) di bagian akhir. Anda harus mendeklarasikan sendiri nama dan jenis kolom output, dan keduanya harus sesuai dengan jumlah serta urutan kategori.
Jika suatu kategori tidak ada pada sebuah baris, crosstab mengisinya berdasarkan posisi, yang dapat membuat data tidak selaras kecuali Anda menggunakan bentuk dua argumen di bawah ini.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2'
) AS ct(region text, q1 numeric, q2 numeric);
-- ct(...) MUST list every output column and its typecrosstab Dua Argumen
Untuk menghindari ketidakselarasan ketika beberapa baris tidak memiliki kategori tertentu, gunakan bentuk dua argumen. Kueri kedua mengembalikan daftar lengkap nilai kategori dalam urutan yang benar, sehingga crosstab mengetahui dengan tepat kolom tempat setiap nilai harus ditempatkan.
Inilah bentuk andal yang diharapkan pewawancara ketika kategori tersebar.
SELECT *
FROM crosstab(
'SELECT region, quarter, amount FROM sales ORDER BY 1, 2',
'SELECT DISTINCT quarter FROM sales ORDER BY 1'
) AS ct(region text, q1 numeric, q2 numeric);MySQL Tidak Memiliki Keduanya
Jika pewawancara bertanya tentang MySQL, jawabannya langsung: MySQL tidak memiliki PIVOT maupun crosstab. Satu-satunya pilihan Anda adalah agregasi kondisional dengan CASE (atau bentuk singkat SUM(... ) + IF()).
Inilah alasan pola CASE yang kompatibel lintas sistem sangat dihargai: pola ini adalah pilihan paling dasar yang berfungsi di mana saja.
-- MySQL: only conditional aggregation works
SELECT
region,
SUM(IF(quarter = 'Q1', amount, 0)) AS q1,
SUM(IF(quarter = 'Q2', amount, 0)) AS q2
FROM sales
GROUP BY region;Contoh Praktik: Penghitungan Status di SQL Server
Permintaan laporan: "satu baris per wilayah, dengan kolom yang menghitung pesanan dalam setiap status." Di SQL Server, masukkan tabel turunan yang sudah dibatasi ke dalam PIVOT menggunakan COUNT.
Karena Anda menghitung kolom status itu sendiri, setiap baris status yang bukan NULL dalam suatu kelompok akan dihitung. SELECT bagian luar mencantumkan setiap status sebagai kolom dalam kurung siku. Ini adalah alternatif ringkas daripada menulis tiga ekspresi COUNT(CASE ...).
SELECT region, [pending], [shipped], [delivered]
FROM (SELECT region, status FROM orders) AS src
PIVOT (
COUNT(status)
FOR status IN ([pending], [shipped], [delivered])
) AS p;Keterbatasan yang Sama
PIVOT dan crosstab memiliki keterbatasan utama yang sama dengan agregasi kondisional: kolom output harus diketahui saat Anda menulis kueri.
- SQL Server: daftar
INditulis secara tetap. - crosstab PostgreSQL: daftar definisi kolom ditulis secara tetap.
Keduanya tidak dapat menemukan kategori saat program berjalan. Untuk itu, Anda perlu membuat teks SQL secara dinamis.
Mana yang Sebaiknya Digunakan?
Jawaban wawancara yang baik membandingkannya secara jujur:
- Agregasi CASE: kompatibel lintas sistem, mudah dibaca, dan berfungsi di setiap mesin database. Pilihan bawaan.
- SQL Server PIVOT: ringkas untuk banyak kolom, tetapi pengelompokan implisitnya sering mengejutkan orang.
- crosstab PostgreSQL: kuat tetapi panjang, memerlukan ekstensi dan daftar definisi kolom.
Jika ragu, gunakan agregasi kondisional dan sebutkan operator khusus produk sebagai alternatif.
Pemeriksaan Singkat
Tentukan dengan tepat perilaku SQL Server PIVOT yang biasanya ditanyakan pewawancara.
Ringkasan
Sintaks pivot khusus produk dalam satu tampilan:
- SQL Server:
PIVOT (SUM(x) FOR col IN ([a],[b])), dengan GROUP BY implisit atas kolom yang tersisa. - PostgreSQL:
crosstab()daritablefunc, yang memerlukan daftar definisi kolom; gunakan bentuk dua argumen untuk data yang tersebar. - MySQL: keduanya tidak ada, gunakan
CASE. - Ketiganya memerlukan kolom yang sudah diketahui saat kueri ditulis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Sintaks PIVOT dan Crosstab Vendor” gratis?
Ya — teks lengkap “Sintaks PIVOT dan Crosstab Vendor” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Sintaks PIVOT dan Crosstab Vendor”?
PIVOT di SQL Server dan crosstab di Postgres, beserta keterbatasannya. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?
Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Sintaks PIVOT dan Crosstab Vendor” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?
Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat
- Sintaks PIVOT dan Crosstab Vendor
- Mengubah Kolom Menjadi Baris
- PIVOT Dinamis dengan Kolom yang Belum Diketahui