OVER & PARTITION BY di SQL

Menghitung agregat per kelompok tanpa meringkas baris. Setiap baris tetap tampil, ditambah hasil hitungan kelompoknya.

Penjelasan sederhana

Fungsi agregat seperti SUM biasanya merangkum banyak baris menjadi satu. Dengan OVER, hasil hitungannya ditempelkan ke setiap baris tanpa merangkumnya. Semua baris asli tetap tampil.

PARTITION BY membagi data menjadi kelompok, mirip GROUP BY, tapi barisnya tidak dilebur. Hasilnya, setiap transaksi bisa sekaligus menampilkan nilai dirinya sendiri dan total kelompoknya, sehingga mudah menghitung porsi.

Sintaks

AGREGAT(kolom) OVER (
  PARTITION BY kolom_kelompok
  ORDER BY kolom_urut
)
BagianKeterangan
OVER ()Tanda bahwa ini window function.
PARTITION BYOpsional. Membagi data per kelompok, mirip GROUP BY tapi baris tidak dirangkum.
ORDER BYOpsional. Urutan di dalam tiap kelompok.

Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.

Contoh OVER & PARTITION BY

Data contoh: penjualan

Tabel penjualan

idtanggalkaryawan_idprodukkategoriqtyharga
1 2026-01-05 4 Laptop Elektronik 2 8500000
2 2026-01-12 6 Printer Elektronik 1 2300000
3 2026-01-20 4 Kursi Kantor Furnitur 5 1200000
4 2026-02-03 6 Laptop Elektronik 1 8500000
5 2026-02-14 4 Meja Kerja Furnitur 3 1750000
6 2026-02-25 5 Kertas A4 ATK 20 55000
7 2026-03-02 6 Kursi Kantor Furnitur 4 1200000
8 2026-03-10 4 Printer Elektronik 2 2300000
9 2026-03-18 5 Kertas A4 ATK 30 55000
10 2026-03-27 6 Monitor Elektronik 3 1900000
query.sql
SELECT produk, kategori,
       qty * harga AS omzet,
       SUM(qty * harga) OVER (PARTITION BY kategori) AS omzet_kategori
FROM penjualan
ORDER BY kategori, omzet DESC;
>_ Jalankan & ubah query ini di browser

Hasil 10 baris

produkkategoriomzetomzet_kategori
Kertas A4 ATK 1650000 2750000
Kertas A4 ATK 1100000 2750000
Laptop Elektronik 17000000 38100000
Laptop Elektronik 8500000 38100000
Monitor Elektronik 5700000 38100000
Printer Elektronik 4600000 38100000
Printer Elektronik 2300000 38100000
Kursi Kantor Furnitur 6000000 16050000
Meja Kerja Furnitur 5250000 16050000
Kursi Kantor Furnitur 4800000 16050000

Setiap transaksi tetap tampil, lengkap dengan total omzet kategorinya. Cocok untuk menghitung porsi (%) tiap baris.

Cara kerjanya, langkah demi langkah

  1. FROM penjualan: 10 transaksi diambil, semuanya akan tetap tampil.
  2. qty * harga AS omzet: nilai tiap transaksi dihitung.
  3. SUM(qty * harga) OVER (PARTITION BY kategori): transaksi dibagi per kategori, dan total tiap kategori dihitung. ATK 2.750.000, Elektronik 38.100.000, Furnitur 16.050.000.
  4. Total itu ditempelkan ke setiap baris di kategorinya. Kedua transaksi Kertas A4 sama-sama menampilkan 2.750.000 di kolom omzet_kategori.

Dipakai untuk apa di kantor?

  • Menghitung porsi penjualan tiap produk terhadap total kategorinya.
  • Membandingkan gaji tiap karyawan dengan rata-rata departemennya.

Kesalahan yang sering terjadi

  • Mengira OVER sama dengan GROUP BY. GROUP BY mengurangi jumlah baris, sedangkan OVER tidak.
  • Memakai window function di WHERE. Tidak bisa; bungkus dulu dengan CTE, lalu saring di query luar.
Progres bab Window Function 0/5 dipelajari
Lanjut: ROW_NUMBER

Belajar SQL bareng mentor

Hafal sintaks itu mudah. Menjawab pertanyaan bisnis, itu skill.

Private Class Python & SQL untuk Data: dari query dasar sampai JOIN dan studi kasus kerja, dengan kurikulum dan jadwal yang menyesuaikan kamu.

Lihat Private Class