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
)
| Bagian | Keterangan |
|---|---|
OVER () | Tanda bahwa ini window function. |
PARTITION BY | Opsional. Membagi data per kelompok, mirip GROUP BY tapi baris tidak dirangkum. |
ORDER BY | Opsional. 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
| id | tanggal | karyawan_id | produk | kategori | qty | harga |
|---|---|---|---|---|---|---|
| 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 |
SELECT produk, kategori,
qty * harga AS omzet,
SUM(qty * harga) OVER (PARTITION BY kategori) AS omzet_kategori
FROM penjualan
ORDER BY kategori, omzet DESC;
Hasil 10 baris
| produk | kategori | omzet | omzet_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
FROM penjualan: 10 transaksi diambil, semuanya akan tetap tampil.qty * harga AS omzet: nilai tiap transaksi dihitung.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.- 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
OVERsama denganGROUP BY.GROUP BYmengurangi jumlah baris, sedangkanOVERtidak. - Memakai window function di
WHERE. Tidak bisa; bungkus dulu dengan CTE, lalu saring di query luar.
ROW_NUMBER