0Pricing
Coding Interview Prep · Pelajaran

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      | 250

Pola 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 | 250

Memilih Agregat yang Tepat

Agregat yang membungkus CASE harus sesuai dengan pertanyaannya:

  • SUM ketika setiap sel menjumlahkan nilai.
  • MAX atau MIN ketika setiap pasangan wilayah/kuartal memiliki tepat satu nilai dan Anda hanya ingin menampilkannya.
  • COUNT ketika 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 CASE untuk setiap kolom output, dibungkus dalam agregat.
  • SUM untuk total, MAX/MIN untuk sel bernilai tunggal, dan COUNT untuk penghitungan.
  • Berfungsi karena agregat mengabaikan NULL dari cabang yang tidak cocok.
  • Gunakan COALESCE untuk 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

  1. Mengubah Baris Menjadi Kolom dengan Agregasi Bersyarat
  2. Sintaks PIVOT dan Crosstab Vendor
  3. Mengubah Kolom Menjadi Baris
  4. PIVOT Dinamis dengan Kolom yang Belum Diketahui
← Kembali ke Coding Interview Prep