Analisis Data

Google Sheet Query Syntax: Panduan FP&A Lengkap

ModelMonkey16 Mei 20268 menit baca

Artikel ini mencakup setiap klausa yang benar-benar Anda butuhkan dalam model keuangan, lengkap dengan formula yang mengambil data lintas tab.

Struktur Dasar Sintaks QUERY

=QUERY(data, "SELECT col [WHERE condition] [GROUP BY col] [ORDER BY col] [LIMIT n] [LABEL col 'name'] [FORMAT col 'pattern']", headers)

Menurut dokumentasi resmi fungsi QUERY Google (support.google.com/docs, terverifikasi Mei 2026), klausa yang didukung secara berurutan adalah: SELECT, WHERE, GROUP BY, PIVOT, ORDER BY, LIMIT, OFFSET, LABEL, dan FORMAT. Urutannya tidak bisa diubah. Letakkan WHERE sebelum GROUP BY, atau Anda akan mendapat parse error.

Kolom direferensikan berdasarkan huruf - Col1, Col2, dst. - bukan berdasarkan nama header. Inilah hal pertama yang mengejutkan orang yang terbiasa dengan SQL.

=QUERY('Data Mentah'!A:F,
  "SELECT Col1, Col2, SUM(Col4)
   WHERE Col3 = 'Asia Tenggara'
   GROUP BY Col1, Col2
   ORDER BY SUM(Col4) DESC",
  1)

Angka 1 di akhir memberi tahu QUERY untuk memperlakukan baris pertama sebagai header. Gunakan 0 jika range Anda tidak memiliki header, atau -1 untuk deteksi otomatis.

Klausa WHERE: Aturan Inti Sintaks QUERY

WHERE adalah tempat di mana sebagian besar kesalahan sintaks berasal. Aturannya:

String memerlukan tanda kutip tunggal di dalam query string yang sudah dikutip ganda:

WHERE Col2 = 'EMEA'

Angka tidak perlu tanda kutip:

WHERE Col4 > 250000

Tanggal memerlukan kata kunci date:

WHERE Col1 >= date '2026-01-01'

Referensi sel tidak bisa masuk ke dalam string literal - Anda harus menggabungkannya dari luar:

=QUERY('P&L'!A:E,
  "SELECT Col1, Col3, Col4
   WHERE Col2 = '" & Asumsi!$B$5 & "'
   AND Col4 > " & Asumsi!$C$3,
  1)

Inilah cara Anda menghubungkan QUERY ke tab asumsi. Filter wilayah di $B$5 dan batas bawah pendapatan di $C$3 mengendalikan seluruh output secara dinamis. Ubah satu sel, seluruh kueri dijalankan ulang.

Penanganan nilai kosong (null): QUERY secara default menghapus baris dengan nilai null pada kolom yang diagregasi. Jika Anda mengagregasi data headcount yang memiliki celah, bungkus dengan IFERROR atau isi terlebih dahulu sel kosong dengan "".

Sintaks QUERY untuk Model Keuangan Multi-Tab

Formula QUERY satu tab cocok untuk demo. Model yang sesungguhnya menarik data lintas sheet.

Margin kontribusi per lini produk, mengambil dari tab transaksi:

=QUERY('Transaksi'!A:H,
  "SELECT Col3, SUM(Col5), SUM(Col6), SUM(Col5)-SUM(Col6)
   WHERE Col8 = 'Q1 2026'
   AND Col2 != 'Internal'
   GROUP BY Col3
   ORDER BY SUM(Col5)-SUM(Col6) DESC
   LABEL Col3 'Lini Produk', SUM(Col5) 'Pendapatan', SUM(Col6) 'HPP', SUM(Col5)-SUM(Col6) 'Laba Kotor'",
  1)

Formula ini menampilkan margin kontribusi per SKU dari 4.200 baris data transaksi tanpa pivot table atau kolom pembantu.

Pengambilan headcount bergulir untuk sensitivitas runway:

=QUERY(Headcount!$A:$G,
  "SELECT Col2, Col3, SUM(Col5)
   WHERE Col6 = '" & Dashboard!$B$2 & "'
   AND Col4 >= date '" & TEXT(Dashboard!$B$3,"yyyy-mm-dd") & "'
   GROUP BY Col2, Col3
   ORDER BY Col2",
  1)

Dashboard!$B$2 menyimpan filter departemen. Dashboard!$B$3 menyimpan tanggal mulai. Ubah salah satunya dan proyeksi runway langsung diperbarui di seluruh model 12 entitas.

Sintaks GROUP BY, PIVOT, dan Agregasi dalam QUERY

GROUP BY mengharuskan setiap kolom yang tidak diagregasi dalam SELECT juga muncul di GROUP BY. Ini adalah perilaku SQL standar, tetapi QUERY hanya akan menampilkan Invalid query: Column [X] is not in grouping tanpa penjelasan lebih lanjut.

PIVOT adalah klausa yang paling banyak diabaikan oleh analis. Klausa ini mentranspos hasil GROUP BY menjadi cross-tab:

=QUERY('P&L'!A:E,
  "SELECT Col1, SUM(Col4)
   WHERE Col3 != 'Intercompany'
   GROUP BY Col1
   PIVOT Col2",
  1)

Jika Col2 berisi kuartal (Q1, Q2, Q3, Q4), formula ini menghasilkan pendapatan per entitas x kuartal dalam satu formula. Tidak ada kolom pembantu, tidak ada refresh pivot table. Header kolom bersifat dinamis - tambahkan data Q5 ke sumber dan pivot tumbuh secara otomatis.

Agregasi yang didukung menurut GViz Query Language Reference (developers.google.com/chart/interactive/docs/querylanguage, versi Mei 2026): SUM, AVG, COUNT, MAX, MIN. Tidak ada MEDIAN atau STDEV - untuk keduanya Anda memerlukan array formula yang membungkus output QUERY.

LABEL dan FORMAT: Merapikan Output QUERY untuk Laporan Direksi

Output QUERY mentah menggunakan huruf kolom sebagai header (secara harfiah SUM(Col4)). Untuk laporan triwulanan ke direksi, Anda membutuhkan label yang mudah dibaca dan angka yang terformat.

=QUERY('Pendapatan'!A:F,
  "SELECT Col1, SUM(Col4), AVG(Col4), MAX(Col4)
   WHERE Col2 = 'Recurring'
   AND Col3 >= date '2026-01-01'
   GROUP BY Col1
   ORDER BY SUM(Col4) DESC
   LABEL Col1 'Segmen', SUM(Col4) 'Total ARR', AVG(Col4) 'Rata-rata Deal', MAX(Col4) 'Deal Terbesar'
   FORMAT SUM(Col4) '#,##0', AVG(Col4) '#,##0', MAX(Col4) '#,##0'",
  1)

FORMAT menerima string format angka standar Google Sheets. Gunakan #,##0 untuk bilangan bulat (tambahkan prefix Rp di LABEL jika perlu), #,##0.00 untuk dua desimal, dan #,##0.0% untuk persentase. Pemformatan ini hanya bersifat tampilan - nilai sel yang mendasarinya tetap numerik, sehingga SUMIFS yang mengacu pada output ini masih berfungsi.

Satu catatan penting: FORMAT berlaku pada rendering sel output QUERY, bukan pada format sel itu sendiri. Jika seseorang menyalin output ke sheet lain, pemformatan akan hilang. Untuk laporan direksi, lakukan paste-as-values sebelum mengirimkan.

Sintaks QUERY vs. SUMIFS: Kapan Menggunakan Masing-masing

Keduanya bisa mengagregasi lintas tab. Pilihan bergantung pada apa yang sedang Anda bangun.

SkenarioQUERYSUMIFS
Satu nilai agregatBerlebihanLebih baik
Tabel output multi-kolomLebih baikRumit
Pengelompokan dinamis / PIVOTSatu-satunya pilihanTidak bisa
Lintas tab dengan named rangePerlu penggabungan string=SUMIFS('P&L'!C:C,'P&L'!B:B,">="&Asumsi!$B$3)
Digunakan oleh formula lainBerisiko (output bergeser)Referensi sel stabil
Data sumber 50.000+ barisLebih lambatLebih cepat

SUMIFS lebih unggul ketika Anda membutuhkan satu angka di satu sel yang menjadi acuan formula lain. QUERY lebih unggul ketika Anda membutuhkan tabel output terformat untuk pelaporan. Memadukan keduanya - SUMIFS untuk logika model, QUERY untuk tampilan output - biasanya adalah pendekatan yang tepat.

Kesalahan Umum Sintaks QUERY dan Artinya

PARSE_ERROR - Biasanya klausa yang tidak berurutan, atau string yang tidak memiliki tanda kutip tunggal penutup. Periksa bahwa setiap penggabungan string menutup setiap ' dengan benar.

Invalid query: Column [ColN] is in SELECT but not in GROUP BY - Anda mengagregasi beberapa kolom tetapi lupa menambahkan kolom yang tidak diagregasi ke GROUP BY.

Invalid query: Unable to parse date string - Penggabungan tanggal Anda tidak menghasilkan format yyyy-mm-dd. Bungkus dengan TEXT(sel_tanggal,"yyyy-mm-dd").

#N/A tanpa pesan error - Kueri mengembalikan 0 baris. Biasanya filter yang tidak cocok dengan data apa pun. Periksa nilai string Anda karena QUERY bersifat case-sensitive. 'Asia Tenggara' dan 'asia tenggara' dianggap berbeda.

#VALUE! - Tipe data campuran di kolom sumber. Kolom yang dianggap QUERY sebagai numerik tetapi mengandung bahkan satu sel teks akan merusak perbandingan numerik. Bersihkan data sumber atau gunakan filter ISNUMBER.

FAQ: Pertanyaan Umum Seputar Sintaks QUERY Google Sheets

Apakah QUERY bisa mengambil data dari beberapa tab sekaligus?

Tidak secara langsung. QUERY hanya menerima satu range sebagai argumen data. Untuk menggabungkan beberapa tab, gunakan {Tab1!A:F; Tab2!A:F} sebagai range sumber - kurung kurawal menggabungkan range secara vertikal sebelum QUERY memprosesnya. Pastikan struktur kolom kedua tab identik.

Kenapa hasil QUERY kosong padahal data sudah ada?

Penyebab paling umum adalah ketidakcocokan tipe data atau case. QUERY bersifat case-sensitive: 'Jakarta' dan 'jakarta' dianggap dua nilai berbeda. Selain itu, pastikan kolom yang difilter tidak mengandung campuran tipe data (misalnya, sebagian teks dan sebagian angka dalam satu kolom).

Apakah bisa menggunakan nama header kolom, bukan Col1, Col2?

Tidak. Google Visualization API Query Language hanya mendukung notasi posisional (Col1, Col2, dst.), bukan nama header. Jika susunan kolom sumber berubah, semua referensi posisional di query string perlu diperbarui secara manual.

Bagaimana cara menghitung persentase dalam QUERY?

QUERY tidak mendukung pembagian langsung antar agregasi dalam satu klausa SELECT. Pendekatan yang umum: tampilkan dua kolom numerik terpisah via QUERY, lalu hitung persentasenya di kolom tambahan di luar output QUERY menggunakan formula biasa.

Apakah QUERY mendukung kondisi OR?

Ya. Gunakan operator OR di klausa WHERE: WHERE Col2 = 'Jakarta' OR Col2 = 'Surabaya'. Untuk banyak nilai, pendekatan ini lebih ringkas dibanding menggabungkan beberapa kondisi AND.

Named Range dan Performa QUERY

Per Mei 2026, named range berfungsi sebagai argumen data dalam QUERY:

=QUERY(LedgerTransaksi,
  "SELECT Col1, Col2, SUM(Col5)
   WHERE Col3 = 'Aktual'
   GROUP BY Col1, Col2",
  1)

Ini membuat formula lebih mudah dibaca dan memisahkan kueri dari struktur tab fisik. Jika Anda mengorganisasi ulang tab, cukup perbarui definisi named range dan setiap QUERY yang mereferensikannya akan diperbarui secara otomatis.

Performa mulai menurun secara terasa pada range di atas 50.000 baris. QUERY menghitung ulang setiap kali ada perubahan pada sel mana pun di range sumber. Untuk log transaksi bervolume besar, filter terlebih dahulu ke range kerja yang lebih kecil menggunakan tab pembantu, lalu jalankan QUERY terhadap range tersebut. Perbedaan waktu kalkulasi ulang bisa mencapai 10 kali lipat.

Jika Anda perlu menggabungkan data dari dua range - misalnya, mencocokkan ID transaksi dengan tabel referensi - QUERY tidak bisa melakukannya secara native. Anda perlu menggabungkan data terlebih dahulu, atau menggunakan sidebar ModelMonkey, yang menjalankan SQL sesungguhnya terhadap range sheet Anda melalui mesin DuckDB tertanam dan mendukung join, window function, serta agregasi yang tidak tersedia di QUERY.

Kesimpulan

Sintaks QUERY Google Sheets memberi Anda pelaporan bergaya SQL tanpa meninggalkan Sheets: urutan klausa bersifat tetap (SELECT lalu WHERE lalu GROUP BY lalu PIVOT lalu ORDER BY lalu LABEL lalu FORMAT), referensi kolom menggunakan notasi posisional (Col1, Col2), dan referensi sel digabungkan di luar query string. Gunakan untuk tabel output dan tampilan laporan direksi; pertahankan SUMIFS untuk logika model yang menjadi acuan formula lain.