Analisis Data

Fungsi Agregat QUERY Google Sheets: Daftar Lengkap

Marc Sean18 April 20269 menit baca

Fungsi agregat di QUERY Google Sheets hanya ada lima: sum(), avg(), count(), max(), dan min(). Itulah daftar lengkapnya. Tidak ada window function, tidak ada countd(), tidak ada median - hanya lima. Bagi yang terbiasa dengan toolkit agregat SQL penuh, ini memang terasa terbatas. Namun kelima fungsi ini sudah mencakup 80% kebutuhan ringkasan lintas-tabel dalam model keuangan.

QUERY mengikuti spesifikasi Google Visualization API Query Language, yang oleh Google sendiri disebut sebagai "SQL yang dibatasi." Menurut Google Visualization API Query Language Reference (developers.google.com, diakses April 2026), daftar fungsi agregat yang tersedia tidak bertambah sejak rilis pertama - stabil dan singkat.

Lima Fungsi Agregat QUERY Google Sheets

FungsiSintaksKeteranganContoh Penggunaan di Keuangan
sum()sum(Kol)Total nilai numerik kolomPendapatan per wilayah, biaya headcount
avg()avg(Kol)Rata-rata kolom numerikRata-rata nilai deal, blended rate tidak tertimbang
count()count(Kol)Jumlah baris non-nullVolume transaksi, jumlah deal
max()max(Kol)Nilai tertinggi di kolomPuncak pengeluaran, ARR akun terbesar
min()min(Kol)Nilai terendah di kolomHarga dasar, margin minimum

Kelima fungsi ini wajib disertai klausa GROUP BY jika Anda mengelompokkan data - QUERY tidak akan menyimpulkannya secara otomatis. Berbeda dari SQL standar, Anda tidak bisa mencampur kolom yang diagregasi dengan yang tidak tanpa secara eksplisit mengelompokkan kolom yang tidak diagregasi.

SUM dengan GROUP BY: Pendapatan per Departemen

Ini adalah pola paling sering dipakai. Contohnya tab P&L yang menarik data dari ledger transaksi:

=QUERY('Transaksi'!A:E,
  "SELECT C, sum(D)
   WHERE B >= date '"&TEXT(Asumsi!$B$3,"yyyy-mm-dd")&"'
   AND B <= date '"&TEXT(Asumsi!$C$3,"yyyy-mm-dd")&"'
   GROUP BY C
   LABEL sum(D) 'Pendapatan'",1)

Kolom C adalah departemen, kolom D adalah jumlah. Rentang tanggal diambil dari Asumsi!$B$3:$C$3 sehingga periode dikendalikan dari satu tempat. Ubah tanggal di tab Asumsi, dan semua QUERY yang bergantung padanya langsung diperbarui.

Untuk board pack yang merangkum Rp 6,3 miliar pendapatan Q1 dari 6 cost center, pola ini berjalan dalam waktu di bawah 2 detik pada ledger 50.000 baris - lebih cepat dari pivot table yang harus di-refresh secara manual.

AVG: Nilai Deal dan Batasannya

=QUERY('Pipeline'!A:F,
  "SELECT D, avg(E), count(A)
   WHERE F = 'Closed Won'
   AND C >= date '"&TEXT(TODAY()-90,"yyyy-mm-dd")&"'
   GROUP BY D
   LABEL avg(E) 'Rata-rata Nilai Deal', count(A) 'Jumlah Deal'",1)

Kolom D adalah sales rep, E adalah ACV, F adalah stage. Formula ini menghasilkan rata-rata nilai deal (Rp 280 juta dalam model kami) beserta jumlah deal per rep dalam satu formula - tanpa helper column.

Satu hal yang tidak bisa ditangani avg(): rata-rata tertimbang. avg() di QUERY memperlakukan setiap baris dengan bobot yang sama. Untuk blended rate yang ditimbang berdasarkan pokok pinjaman atau ACV, avg() akan menghasilkan angka yang salah jika distribusi nilai per baris tidak merata.

Rata-rata Tertimbang: QUERY Tidak Cukup, Ini Penggantinya

Ini adalah celah yang paling sering menghentikan analis di tengah jalan. QUERY tidak mendukung ekspresi sum(C * D) / sum(C) secara native - sintaks itu tidak valid. Solusinya adalah SUMPRODUCT dengan kondisi array, tanpa QUERY sama sekali.

Contoh: blended interest rate portofolio pinjaman korporasi

Anggap tab Portofolio memiliki struktur berikut:

  • Kolom A: ID pinjaman
  • Kolom B: Status (Aktif / Lunas)
  • Kolom C: Saldo pokok (Rp)
  • Kolom D: Suku bunga per tahun (%)
  • Kolom E: Segmen (Korporasi / Ritel / UMKM)

Untuk menghitung blended rate hanya untuk pinjaman aktif segmen Korporasi:

=SUMPRODUCT(
  (Portofolio!B2:B2000="Aktif")*
  (Portofolio!E2:E2000="Korporasi")*
  Portofolio!C2:C2000*
  Portofolio!D2:D2000
)/SUMPRODUCT(
  (Portofolio!B2:B2000="Aktif")*
  (Portofolio!E2:E2000="Korporasi")*
  Portofolio!C2:C2000
)

Hasilnya adalah blended rate yang sesungguhnya - misalnya 9,3% - bukan rata-rata aritmatika suku bunga yang bisa meleset 80-120 basis poin jika ada satu pinjaman besar dengan rate berbeda. Untuk WACC component breakdown atau yield analysis lintas tranche, pola SUMPRODUCT ini adalah pengganti permanen avg() di QUERY.

Jika Anda perlu breakdown per segmen sekaligus (bukan hanya satu segmen), gabungkan dengan BYROW atau buat tabel referensi dengan satu SUMPRODUCT per baris.

COUNT: Volume Transaksi

=QUERY('GL'!A:G,
  "SELECT E, count(A)
   WHERE D = 'OPEX'
   GROUP BY E
   ORDER BY count(A) DESC
   LABEL count(A) 'Jumlah Transaksi'",1)

count() menghitung nilai non-null di kolom yang ditentukan. Jika Anda ingin distinct count - jumlah vendor unik, jumlah akun unik - QUERY tidak bisa melakukannya secara native. Solusi standarnya adalah membungkus output dengan COUNTUNIQUE, atau menggunakan SUMPRODUCT dengan array COUNTIF pada data sumber:

=SUMPRODUCT(1/COUNTIF(Portofolio!A2:A500,Portofolio!A2:A500))

Inilah keterbatasan terbesar dalam set fungsi agregat QUERY. Sebuah fungsi countd() akan menghilangkan setengah dari workaround helper column yang mengacaukan model keuangan.

MAX dan MIN: Pemeriksaan Batas Nilai

Keduanya sederhana, tetapi sangat berguna dalam analisis varians:

=QUERY('Aktual_Bulanan'!A:D,
  "SELECT B, min(C), max(C), avg(C)
   WHERE A >= date '2025-01-01'
   GROUP BY B
   LABEL min(C) 'Terendah', max(C) 'Tertinggi', avg(C) 'Rata-rata'",1)

Formula ini menghasilkan rentang bulanan untuk setiap line item - berguna untuk mendeteksi cost center yang berfluktuasi dari Rp 420 juta ke Rp 615 juta dari bulan ke bulan padahal seharusnya stabil. Gabungkan max() dengan min() dalam satu query dan Anda mendapat spread tanpa harus menulis dua formula terpisah.

Menggabungkan Beberapa Fungsi Agregat QUERY Google Sheets

QUERY memungkinkan Anda menumpuk beberapa fungsi agregat dalam satu SELECT - inilah alasan utama memilihnya di atas pivot table dalam konteks model keuangan:

=QUERY('Pendapatan'!A:F,
  "SELECT B, C,
          sum(D)   as TotalPendapatan,
          avg(D)   as RataRataDeal,
          count(A) as JumlahDeal,
          max(D)   as DealTerbesar
   WHERE E = 'Enterprise'
   GROUP BY B, C
   ORDER BY sum(D) DESC",1)

Kolom B adalah kuartal, C adalah wilayah, D adalah ACV. Satu formula menghasilkan breakdown regional lengkap: total Rp 4,7 miliar, rata-rata deal Rp 328 juta, 14 deal, deal terbesar Rp 1,3 miliar - dikelompokkan per kuartal dan wilayah, diurutkan berdasarkan pendapatan. Tanpa QUERY, ini membutuhkan 4 pivot table terpisah yang semuanya perlu di-refresh secara manual.

PIVOT: Pola Agregat Plus Crosstab

Klausa PIVOT di QUERY menerapkan fungsi agregat dan mengubah nilai unik menjadi kolom. Contohnya untuk laporan eksposur per counterparty lintas kuartal dalam model sindikasi perbankan:

=QUERY('Eksposur'!A:E,
  "SELECT B, sum(D)
   WHERE C = 'Drawn'
   GROUP BY B
   PIVOT A
   LABEL sum(D) ''",1)

Kolom A adalah kuartal (Q1-Q4), B adalah counterparty, D adalah jumlah eksposur. PIVOT secara otomatis mengubah kuartal menjadi kolom. Catatan pentingnya: header kolom bersifat dinamis, sehingga formula yang mereferensikan kolom tertentu di downstream akan rusak jika struktur pivot berubah. Untuk pelaporan statis yang masuk ke board deck, ini tidak masalah. Untuk model live dengan dependensi downstream, gunakan SUMIFS statis.

Yang Tidak Bisa Dilakukan QUERY

Penting untuk memahami celah-celahnya, karena ini langsung memengaruhi keputusan desain model:

Tidak ada countd() (distinct count). Hitung nilai unik dengan =SUMPRODUCT(1/COUNTIF(range,range)) atau COUNTUNIQUE pada output QUERY.

Tidak ada median(). Gunakan =MEDIAN(IF(...)) sebagai array formula.

Tidak ada stdev() atau var(). Agregat statistik tidak ada dalam spesifikasi. Tarik data dengan QUERY lalu bungkus dengan STDEV() di luar formula.

Tidak ada window function. Running total, rank, dan lag/lead tidak tersedia. Kebutuhan ini memerlukan helper column atau SCAN/LAMBDA di versi Sheets yang lebih baru.

Tidak ada conditional aggregation. Pola SUM(CASE WHEN...) dari SQL tidak bisa diterapkan. Gunakan SUMIFS lintas tab: =SUMIFS('PL'!D:D,'PL'!C:C,"OPEX",'PL'!B:B,">="&Asumsi!$B$3).

Tidak ada rata-rata tertimbang native. avg() memberi bobot sama ke setiap baris. Untuk blended rate, WACC, atau yield analysis, gunakan SUMPRODUCT seperti contoh di atas.

Catatan soal LABEL dan FORMAT

Kedua klausa ini bekerja pada kolom yang diagregasi. LABEL sum(D) 'Pendapatan' mengganti nama header output - krusial ketika header default sum D merusak referensi VLOOKUP di downstream.

FORMAT sum(D) '#.##0' menerapkan format angka langsung pada output query, namun ini mengubah kolom menjadi teks. Formula downstream yang mencoba menjumlahkan atau mereferensikan kolom tersebut - termasuk VLOOKUP yang diharapkan mengembalikan angka - akan menghasilkan error atau nol tanpa pesan kesalahan yang jelas. Ini penyebab yang tidak intuitif dan menghabiskan banyak waktu debug: model 8 tab yang saling referensi bisa gagal hanya karena satu FORMAT di tab P&L mengubah tipe data kolom pendapatan.

Gunakan FORMAT hanya untuk output yang bersifat display saja - misalnya tab ringkasan yang langsung dicetak atau dibagikan. Untuk data yang akan dihitung lebih lanjut, lewati FORMAT dan terapkan format sel secara terpisah melalui menu Format > Angka.

Menurut Google Sheets Function List - QUERY (support.google.com, April 2026): "Klausa LABEL mengatur label untuk satu atau lebih kolom." Klausa ini menerima string literal dan harus ditulis setelah GROUP BY, PIVOT, ORDER BY, dan LIMIT dalam string query.


FAQ: Fungsi Agregat QUERY Google Sheets

Berapa jumlah fungsi agregat yang tersedia di QUERY Google Sheets? Lima fungsi: sum(), avg(), count(), max(), dan min(). Per April 2026, tidak ada fungsi tambahan seperti countd(), median(), stdev(), atau window function dalam spesifikasi Google Visualization API Query Language.

Bagaimana cara menghitung distinct count di QUERY Google Sheets? QUERY tidak mendukung distinct count secara native. Gunakan =SUMPRODUCT(1/COUNTIF(range,range)) untuk menghitung nilai unik di rentang sumber, atau =COUNTUNIQUE(...) pada output QUERY yang sudah ditarik ke range terpisah.

Bagaimana cara menghitung rata-rata tertimbang jika avg() QUERY tidak cukup? Gunakan SUMPRODUCT dengan kondisi array: =SUMPRODUCT((kondisi1)*(kondisi2)*pokok*rate)/SUMPRODUCT((kondisi1)*(kondisi2)*pokok). Ini memberikan blended rate yang sesungguhnya, berbeda dari avg() QUERY yang memberi bobot sama ke setiap baris tanpa mempertimbangkan besarnya nilai.

Apakah klausa FORMAT di QUERY Google Sheets mengubah tipe data kolom? Ya. FORMAT mengubah kolom numerik menjadi teks. Formula downstream seperti SUM, VLOOKUP, atau INDEX/MATCH yang mengharapkan angka akan menghasilkan error atau nol. Gunakan FORMAT hanya untuk output display yang tidak dihitung lebih lanjut; terapkan format tampilan melalui format sel untuk data yang masih perlu diproses.

Apakah QUERY Google Sheets bisa melakukan conditional aggregation seperti SUM(CASE WHEN) di SQL? Tidak. Pola tersebut tidak tersedia dalam spesifikasi QUERY. Gantinya gunakan SUMIFS: =SUMIFS(D:D,C:C,"OPEX",B:B,">="&Asumsi!$B$3) untuk agregasi bersyarat lintas tab.

Apakah QUERY Google Sheets mendukung window function seperti running total atau rank? Tidak. Running total, rank, lag, dan lead tidak tersedia di QUERY. Gunakan helper column atau fungsi SCAN/LAMBDA yang tersedia di Google Sheets versi terbaru.


Jika Anda bekerja dengan dataset besar lintas tab dan membutuhkan toolkit yang lebih lengkap - join, window function, countd() - lihat integrasi DuckDB untuk Google Sheets untuk mengetahui seperti apa implementasinya dalam praktik.

Coba ModelMonkey gratis selama 14 hari - tersedia untuk Google Sheets dan Excel.