· 5 menit baca · #SQL #Excel #Data
SQL dan Excel: Dua Cara Berpikir yang Sama tentang Data
Kalau sudah lancar memakai Filter, XLOOKUP, dan PivotTable, Anda sebenarnya sudah memahami separuh SQL. Artikel ini memetakan keduanya langkah demi langkah.
Oleh Ahmad Lazim · Software Engineer
SQL dan Excel sering dianggap berasal dari dua dunia yang berbeda: satu untuk programmer, satu lagi untuk orang kantoran. Padahal keduanya bekerja dengan bentuk data yang sama, yaitu tabel berisi baris dan kolom, dan menjawab pertanyaan yang sama: baris mana yang saya butuhkan, bagaimana urutannya, dan berapa totalnya.
Artikel ini memetakan operasi SQL yang paling sering dipakai ke padanannya di Excel, memakai satu set data contoh yang sama. Bagi pengguna Excel, ini jalan pintas untuk belajar SQL.
Data contoh
Kita pakai dua tabel kecil. Di Excel, ubah setiap rentang menjadi Excel Table (pilih datanya lalu tekan Ctrl+T), kemudian beri nama Pesanan dan Pelanggan lewat tab Table Design. Dengan begitu kita bisa memakai structured reference seperti Pesanan[total] yang jauh lebih mudah dibaca daripada E2:E6.
Tabel pesanan:
id_pesanan | tanggal | id_pelanggan | produk | total
------------+------------+--------------+----------+---------
1001 | 2026-08-01 | P01 | Keyboard | 350000
1002 | 2026-08-01 | P02 | Mouse | 150000
1003 | 2026-08-02 | P01 | Monitor | 1800000
1004 | 2026-08-03 | P03 | Mouse | 150000
1005 | 2026-08-03 | P02 | Headset | 450000
Tabel pelanggan:
id_pelanggan | nama | kota
--------------+-------+----------
P01 | Rina | Bandung
P02 | Dimas | Jakarta
P03 | Sari | Surabaya
WHERE adalah Filter
Pertanyaan: pesanan mana yang nilainya minimal Rp300.000?
SELECT id_pesanan, produk, total
FROM pesanan
WHERE total >= 300000;
Cara manual di Excel: klik salah satu sel tabel, buka Data > Filter, klik panah di kolom total, pilih Number Filters > Greater Than Or Equal To, lalu isi 300000. Hasilnya pesanan 1001, 1003, dan 1005.
Di Microsoft 365 ada cara yang lebih mirip SQL, yaitu fungsi FILTER. Untuk kondisi ganda, AND ditulis sebagai perkalian dan OR sebagai penjumlahan:
WHERE total >= 300000 AND tanggal >= '2026-08-02'
=FILTER(Pesanan, (Pesanan[total] >= 300000) * (Pesanan[tanggal] >= DATE(2026,8,2)))
Filter bawaan hanya menyembunyikan baris, sedangkan FILTER dan WHERE menghasilkan kumpulan data baru tanpa mengubah sumbernya. Cara berpikir kedua inilah yang dipakai SQL.
ORDER BY adalah Sort
SELECT * FROM pesanan
ORDER BY total DESC, tanggal ASC
LIMIT 3;
Di Excel: buka Data > Sort, pilih total dengan urutan Largest to Smallest, klik Add Level, lalu pilih tanggal dengan urutan Oldest to Newest. Versi rumusnya:
=TAKE(SORTBY(Pesanan, Pesanan[total], -1, Pesanan[tanggal], 1), 3)
SORTBY berperan sebagai ORDER BY (angka -1 berarti menurun), dan TAKE berperan sebagai LIMIT.
JOIN adalah XLOOKUP atau VLOOKUP
Tabel pesanan hanya menyimpan id_pelanggan. Untuk menampilkan nama dan kota, SQL memakai JOIN:
SELECT p.id_pesanan, p.produk, p.total, c.nama, c.kota
FROM pesanan AS p
LEFT JOIN pelanggan AS c ON c.id_pelanggan = p.id_pelanggan;
Di Excel, tambahkan kolom nama di tabel Pesanan, lalu isi dengan:
=XLOOKUP([@id_pelanggan], Pelanggan[id_pelanggan], Pelanggan[nama], "Tidak ditemukan")
Untuk versi Excel lama yang belum punya XLOOKUP:
=VLOOKUP([@id_pelanggan], Pelanggan, 2, FALSE)
VLOOKUP punya dua jebakan klasik. Kolom kunci harus berada paling kiri di tabel sumber, dan argumen terakhir wajib FALSE. Tanpa FALSE, Excel melakukan pencarian approximate dan bisa mengembalikan nama yang salah tanpa pesan error apa pun.
Ada satu perbedaan konsep yang penting. JOIN mengembalikan semua pasangan yang cocok, jadi kalau id_pelanggan ternyata ganda di tabel pelanggan, baris pesanan ikut berlipat. XLOOKUP hanya mengambil kecocokan pertama. Keduanya baru setara kalau kolom kunci di tabel acuan benar-benar unik, dan itulah alasan kolom seperti ini dijadikan primary key di database. Nilai "Tidak ditemukan" di Excel setara dengan NULL pada LEFT JOIN. Kalau baris tersebut dibuang, hasilnya sama dengan INNER JOIN.
GROUP BY adalah PivotTable
Pertanyaan: berapa jumlah pesanan dan total belanja tiap pelanggan?
SELECT id_pelanggan,
COUNT(*) AS jumlah_pesanan,
SUM(total) AS total_belanja
FROM pesanan
GROUP BY id_pelanggan
ORDER BY total_belanja DESC;
Langkah dengan PivotTable:
- Klik tabel
Pesanan, lalu pilih Insert > PivotTable. - Seret
id_pelangganke area Rows. Ini adalahGROUP BY. - Seret
totalke Values sehingga menjadi Sum of total. Ini adalahSUM(total). - Seret
id_pesananke Values, lalu ubah Value Field Settings menjadi Count. Ini adalahCOUNT(*). - Urutkan kolom total dari yang terbesar.
Hasilnya: P01 punya 2 pesanan senilai 2.150.000, P02 punya 2 pesanan senilai 600.000, dan P03 punya 1 pesanan senilai 150.000.
Kalau hanya ingin pelanggan dengan belanja di atas 500.000, SQL menambahkan HAVING SUM(total) > 500000. Padanannya di PivotTable adalah Value Filters pada label baris. Microsoft 365 versi terbaru juga punya fungsi GROUPBY, misalnya =GROUPBY(Pesanan[id_pelanggan], Pesanan[total], SUM), untuk hasil serupa tanpa membuat PivotTable.
Fungsi agregat dengan kondisi
Sering kali kita hanya butuh satu angka. Di SQL, agregat digabung dengan WHERE:
SELECT SUM(total) FROM pesanan WHERE produk = 'Mouse'; -- 300000
SELECT COUNT(*) FROM pesanan WHERE total >= 300000; -- 3
SELECT AVG(total) FROM pesanan WHERE id_pelanggan = 'P02'; -- 300000
Di Excel, padanannya adalah fungsi berakhiran IF dan IFS:
=SUMIFS(Pesanan[total], Pesanan[produk], "Mouse")
=COUNTIF(Pesanan[total], ">=300000")
=AVERAGEIF(Pesanan[id_pelanggan], "P02", Pesanan[total])
Hati-hati dengan urutan argumen. Di SUMIFS, rentang yang dijumlahkan ada di depan, sedangkan di SUMIF dan AVERAGEIF justru ada di belakang. Biasakan memakai versi IFS (SUMIFS, COUNTIFS, AVERAGEIFS) karena urutannya konsisten dan bisa menampung banyak kondisi, persis seperti WHERE ... AND ....
Untuk COUNT(DISTINCT ...), gabungkan UNIQUE dengan COUNTA:
=COUNTA(UNIQUE(Pesanan[id_pelanggan]))
Satu hal lagi: AVG di SQL mengabaikan NULL, dan AVERAGE di Excel mengabaikan sel kosong. Namun angka 0 tetap dihitung di keduanya, jadi jangan mengisi data yang belum ada dengan 0.
CSV: jembatan di antara keduanya
Dari database ke Excel
Ekspor hasil query ke CSV. Di PostgreSQL dengan psql:
\copy (SELECT * FROM pesanan) TO 'pesanan.csv' WITH (FORMAT csv, HEADER)
Jangan langsung klik dua kali file tersebut. Buka lewat Data > From Text/CSV supaya Anda bisa memilih encoding 65001: Unicode (UTF-8), pemisah kolom, dan tipe data sebelum dimuat. Cara ini menghindari tiga masalah umum:
- Semua data masuk ke satu kolom. Dengan pengaturan regional Indonesia, Excel memakai titik koma sebagai pemisah daftar, sehingga CSV berpemisah koma tidak terpecah dengan benar.
- Nol di depan hilang. Nomor telepon
0812...atau kode seperti007berubah menjadi angka. Ubah tipe kolomnya menjadi Text. - Tanggal terbaca salah. Format ISO
YYYY-MM-DDpaling aman untuk dipertukarkan.
Dari Excel ke database
Simpan dengan File > Save As > CSV UTF-8 (Comma delimited), lalu muat ke database:
\copy pesanan FROM 'pesanan.csv' WITH (FORMAT csv, HEADER)
Kalau Excel Anda memakai pengaturan regional Indonesia, file hasilnya bisa saja berpemisah titik koma. Cek dulu dengan text editor, lalu tambahkan DELIMITER ';' bila perlu.
Ringkasan pemetaan
WHEREsetara dengan Filter atau fungsiFILTER.ORDER BYsetara dengan Sort atauSORTBY.LIMITsetara denganTAKE.JOINsetara denganXLOOKUPatauVLOOKUP.GROUP BYsetara dengan PivotTable atauGROUPBY.HAVINGsetara dengan Value Filters di PivotTable.- Agregat dengan
WHEREsetara denganSUMIFS,COUNTIFS, danAVERAGEIFS.
Kapan memakai yang mana
Excel unggul untuk eksplorasi cepat, data berukuran sedang, dan laporan yang perlu dibuka orang non-teknis. SQL unggul ketika data sangat besar (satu sheet Excel dibatasi 1.048.576 baris), dipakai banyak orang sekaligus, atau analisisnya harus bisa diulang dengan cara yang persis sama setiap minggu. Query SQL adalah teks: bisa disimpan, ditinjau, dan dijalankan ulang, sementara rangkaian klik di Excel mudah terlupa.
Latihan yang efektif: ambil satu laporan Excel yang rutin Anda buat, lalu tulis ulang setiap langkahnya sebagai query SQL. SQLite cocok untuk ini karena gratis, tidak perlu server, dan bisa langsung mengimpor CSV. Lama-kelamaan akan terlihat bahwa yang berubah hanya sintaksnya. Cara berpikirnya tetap sama.