Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat
Pola CASE di dalam SUM yang portabel untuk mengubah baris menjadi kolom.
Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 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.
Konteks Wawancara
Salah satu tugas wawancara pelaporan yang paling umum adalah: mengubah baris menjadi kolom. Anda memiliki tabel panjang seperti sales(region, quarter, amount), dan pewawancara menginginkan laporan lebar dengan satu kolom untuk setiap kuartal.
Jawaban portabel yang tidak bergantung pada dialek dan ingin mereka dengar adalah agregasi bersyarat: ekspresi CASE yang ditempatkan di dalam fungsi agregat seperti SUM. Kuasai pola ini dan Anda dapat mengubah bentuk data di basis data apa pun, bahkan yang tidak memiliki kata kunci PIVOT.
Bentuk Panjang dan Lebar
Sebelum mengubah bentuk data, kenali bentuknya. Bentuk panjang menyimpan satu fakta per baris: setiap pasangan wilayah/kuartal berada pada barisnya sendiri. Bentuk lebar menyebarkan suatu kategori ke beberapa kolom.
- Panjang: mudah disisipkan, tetapi sulit dibaca berdampingan.
- Lebar: sangat baik untuk laporan yang ditujukan kepada pembaca.
Transformasi mengubah bentuk panjang menjadi lebar. Pewawancara menyukai hal ini karena menguji apakah Anda memahami agregasi, bukan sekadar sintaks.
-- Long form (the input)
region | quarter | amount
-------+---------+-------
East | Q1 | 100
East | Q2 | 150
West | Q1 | 200
West | Q2 | 250Pola Inti
Caranya: untuk setiap kolom keluaran, tulis CASE yang mengembalikan nilai ketika baris cocok dengan kolom tersebut, dan NULL jika tidak. Bungkus dalam fungsi agregat agar kelompok menyusut menjadi satu baris untuk setiap kunci.
Bacalah sebagai: jumlahkan jumlahnya, tetapi hanya untuk baris kuartal pertama. Karena SUM mengabaikan NULL, baris yang tidak cocok tidak menyumbangkan apa pun.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;Mengapa SUM Mengabaikan NULL
Pola ini berfungsi karena satu fakta yang akan didalami oleh pewawancara: fungsi agregat melewati NULL. CASE tanpa ELSE mengembalikan NULL ketika tidak ada cabang yang cocok, sehingga SUM(CASE WHEN ... THEN amount END) hanya menjumlahkan baris yang Anda pilih.
Jika Anda menulis ELSE 0, pola itu juga akan berfungsi untuk SUM (menambahkan nol tidak mengubah apa pun), tetapi akan merusak hasil AVG, MIN, dan COUNT.
-- Both produce the same SUM result:
SUM(CASE WHEN quarter = 'Q1' THEN amount END)
SUM(CASE WHEN quarter = 'Q1' THEN amount ELSE 0 END)Contoh Praktik: Laporan Kuartalan
Berikut kueri lengkap terhadap data sampel. Setiap wilayah menjadi satu baris; setiap kuartal menjadi satu kolom.
GROUP BY region-lah yang merangkum empat baris input menjadi dua baris output. Tanpanya, Anda akan mendapatkan satu baris untuk setiap baris input, dengan sebagian besar nilai NULL.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2
FROM sales
GROUP BY region;
-- Result:
-- region | q1 | q2
-- East | 100 | 150
-- West | 200 | 250Memilih Agregat yang Tepat
Agregat yang membungkus CASE harus sesuai dengan pertanyaannya:
SUMketika setiap sel menjumlahkan nilai.MAXatauMINketika setiap pasangan wilayah/kuartal memiliki tepat satu nilai dan Anda hanya ingin menampilkannya.COUNTketika setiap sel menghitung baris yang cocok.
Pewawancara sering menanyakan varian COUNT: berapa banyak pesanan untuk setiap status pada setiap bulan?
SELECT
month,
COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped,
COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled
FROM orders
GROUP BY month;MAX untuk Sel Bernilai Tunggal
Ketika setiap pasangan kunci/kategori menyimpan satu nilai (tabulasi silang sejati, bukan total), gunakan MAX atau MIN. Keduanya mengembalikan satu-satunya nilai yang bukan NULL dan mengabaikan nilai NULL dari cabang yang tidak cocok.
Ini adalah pilihan yang aman ketika Anda mengubah bentuk atribut, bukan menjumlahkan uang, misalnya mengubah tabel pengaturan kunci/nilai menjadi satu baris per entitas.
-- Turn key/value rows into one wide row per user
SELECT
user_id,
MAX(CASE WHEN attr = 'city' THEN value END) AS city,
MAX(CASE WHEN attr = 'plan' THEN value END) AS plan
FROM user_attributes
GROUP BY user_id;Menangani Sel Output NULL
Jika suatu wilayah tidak memiliki penjualan Q2, sel q2-nya menjadi NULL. Pewawancara mungkin meminta Anda menampilkan 0 sebagai gantinya. Bungkus seluruh agregat dengan COALESCE.
Letakkan COALESCE di luar agregat, bukan di dalam CASE, agar Anda hanya mengganti nilai ketika seluruh grup tidak memiliki baris yang cocok.
SELECT
region,
COALESCE(SUM(CASE WHEN quarter = 'Q1' THEN amount END), 0) AS q1,
COALESCE(SUM(CASE WHEN quarter = 'Q2' THEN amount END), 0) AS q2
FROM sales
GROUP BY region;Menambahkan Kolom Total Keseluruhan
Pertanyaan lanjutan yang umum: tambahkan total dari semua kolom yang diputar. Anda tidak perlu menjumlahkan kolom berdasarkan namanya. SUM(amount) biasa pada grup yang sama memberikan total baris karena sepenuhnya mengabaikan penyaringan CASE.
Ini menunjukkan kepada pewawancara bahwa Anda memahami setiap agregat dalam SELECT dihitung secara independen atas grup yang sama.
SELECT
region,
SUM(CASE WHEN quarter = 'Q1' THEN amount END) AS q1,
SUM(CASE WHEN quarter = 'Q2' THEN amount END) AS q2,
SUM(amount) AS total
FROM sales
GROUP BY region;Bentuk Singkat Agregat Berfilter
PostgreSQL dan standar SQL mendukung FILTER (WHERE ...), cara yang lebih rapi untuk menulis agregasi kondisional. Bentuk ini lebih mudah dibaca dan menghindari kode berulang CASE.
Sebutkan ini dalam wawancara untuk menunjukkan keluasan pengetahuan Anda, tetapi ketahui bahwa MySQL dan SQL Server tidak mendukungnya, sehingga CASE tetap menjadi jawaban yang kompatibel lintas sistem.
-- Postgres / standard SQL
SELECT
region,
SUM(amount) FILTER (WHERE quarter = 'Q1') AS q1,
SUM(amount) FILTER (WHERE quarter = 'Q2') AS q2
FROM sales
GROUP BY region;Keterbatasan Utama
Agregasi kondisional memiliki satu kelemahan yang akan terus ditanyakan pewawancara: Anda harus mencantumkan setiap kolom output secara manual. Jika kuartal atau kategori belum diketahui sebelumnya, kueri statis ini tidak dapat menyesuaikan diri.
Masalah itu disebut pivot dinamis dan memerlukan SQL yang dibuat secara otomatis. Namun, untuk kumpulan kategori yang tetap dan sudah diketahui, agregasi kondisional adalah pilihan yang rapi dan kompatibel lintas sistem.
Pemeriksaan Singkat
Uji pemahaman Anda tentang pola agregasi kondisional.
Ringkasan
Agregasi kondisional adalah pivot lintas sistem yang dapat diterima setiap pewawancara:
- Satu
CASEuntuk setiap kolom output, dibungkus dalam agregat. SUMuntuk total,MAX/MINuntuk sel bernilai tunggal, danCOUNTuntuk penghitungan.- Berfungsi karena agregat mengabaikan
NULLdari cabang yang tidak cocok. - Gunakan
COALESCEuntuk mengubah sel kosong menjadi 0. - Keterbatasan: kolom harus ditulis secara tetap, sehingga berikutnya kita akan membahas pivot dinamis.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat” gratis?
Ya — teks lengkap “Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat” 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 “Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat”?
Pola CASE di dalam SUM yang portabel untuk mengubah baris menjadi kolom. 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 1 dari 4.
Berapa lama pelajaran “Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat” 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