Google SheetsのQUERY関数で使える集計関数は sum()、avg()、count()、max()、min() の5つです。これが完全なリストです。ウィンドウ関数も countd() も中央値もありません。SQLの集計機能を期待していると、すぐに限界に気づくはずです。それでも、この5つがあれば、財務モデルにおけるクロス集計の8割はカバーできます。
QUERYはGoogle Visualization APIクエリ言語の仕様に基づいています(Google Visualization API クエリ言語リファレンス — developers.google.com/chart/interactive/docs/querylanguage)。同ドキュメントには「制限されたSQLライクな言語」と説明されており、2026年4月時点で集計関数のラインナップはリリース当初から変わっておらず、今後も大きな拡張は見込めません。
Google SheetsのQUERY集計関数一覧
| 関数 | 構文 | 機能 | 財務モデルでの活用例 |
|---|---|---|---|
sum() | sum(Col) | 数値列の合計 | 部門別売上、人件費合計 |
avg() | avg(Col) | 数値列の平均 | 平均受注単価、ブレンドレート |
count() | count(Col) | NULL以外の行数 | 取引件数、案件数 |
max() | max(Col) | 列の最大値 | 費用のピーク、ARR最大顧客 |
min() | min(Col) | 列の最小値 | フロア価格、最低利益率 |
グルーピングを行う場合は必ず GROUP BY 句が必要です。SQLとは異なり、集計列と非集計列を混在させる場合、非集計列は明示的に GROUP BY で指定しなければなりません。QUERYが自動的に推論することはありません。
SUM + GROUP BY:部門別売上の集計
最も使用頻度が高いパターンです。取引台帳から損益タブへデータを引き出す例を示します。
=QUERY('取引台帳'!A:E,
"SELECT C, sum(D)
WHERE B >= date '"&TEXT(前提条件!$B$3,"yyyy-mm-dd")&"'
AND B <= date '"&TEXT(前提条件!$C$3,"yyyy-mm-dd")&"'
GROUP BY C
LABEL sum(D) '売上高'",1)
C列が部門、D列が金額です。集計対象期間は 前提条件!$B$3:$C$3 から取得しているため、管理は1箇所だけで済みます。前提条件シートの日付を変更すれば、下流のQUERYすべてが自動で更新されます。
6つのコストセンターに分けた第1四半期の売上合計4,200万円を取締役会向け資料として出力する場合、このパターンなら5万行の台帳でも2秒以内に処理できます。手動更新が必要なピボットテーブルより実用的です。
AVG:ブレンドレートと平均受注単価
=QUERY('パイプライン'!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) '平均受注単価', count(A) '案件数'",1)
D列が営業担当者、E列がACV(年間契約額)、F列がステージです。担当者ごとの平均受注単価(このモデルでは約186万円)と案件数を、1つの数式で同時に出力できます。補助列は不要です。
ただし、avg() で対応できないケースがあります。売上加重平均レートが必要な場合、計算式は sum(売上 × レート) / sum(売上) ですが、QUERYはこの式を1つのクエリ内で表現できません。実務で使われるのは次のパターンです。QUERYで地域別の売上合計と加重額合計をそれぞれ取り出し、外側のSUMPRODUCTで結合します。
=SUMPRODUCT(
QUERY('売上明細'!A:D,
"SELECT sum(C) GROUP BY B LABEL sum(C)''",1)*1,
QUERY('売上明細'!A:D,
"SELECT avg(D) GROUP BY B LABEL avg(D)''",1)*1
) / SUM(QUERY('売上明細'!A:D,
"SELECT sum(C) GROUP BY B LABEL sum(C)''",1)*1)
データ量が多い場合は、QUERYの出力を一度中間シートに貼り付けてからSUMPRODUCTを参照するほうが、再計算コストを抑えられます。
COUNT:取引件数の集計
=QUERY('仕訳帳'!A:G,
"SELECT E, count(A)
WHERE D = 'OPEX'
GROUP BY E
ORDER BY count(A) DESC
LABEL count(A) '取引件数'",1)
count() は指定した列のNULL以外の値をカウントします。ユニーク件数(仕入先の種類数、勘定科目の種類数など)が必要な場合、QUERYにはネイティブの対応手段がありません。出力結果にCOUNTUNIQUEを重ねる、またはSUMPRODUCTとCOUNTIFの配列を元データに対して使うのが一般的な回避策です。
=SUMPRODUCT(1/COUNTIF('仕訳帳'!E2:E1000,'仕訳帳'!E2:E1000))
これはQUERY集計関数の最大の制約と言えます。countd() 関数が存在すれば、財務モデルに散在する補助列の半分は不要になります。
MAX・MIN:上限・下限の把握
どちらもシンプルですが、予実差異分析で特に役立ちます。
=QUERY('月次実績'!A:D,
"SELECT B, min(C), max(C), avg(C)
WHERE A >= date '2025-01-01'
GROUP BY B
LABEL min(C) '最小値', max(C) '最大値', avg(C) '平均'",1)
各勘定科目の月次変動幅を一覧で確認できます。本来フラットに推移すべきコストセンターが月によって280万円から410万円まで振れているといった異常値の発見に効果的です。max() と min() を同じクエリに含めることで、2本の数式を書かずに振れ幅を把握できます。
複数の集計関数を1つのクエリにまとめる
Google SheetsのQUERY関数の最大の強みは、複数の集計関数をSELECT句に並列で記述できる点です。財務モデルにおいてピボットテーブルより優位なのは、主にこの理由からです。
=QUERY('売上明細'!A:F,
"SELECT B, C,
sum(D) as 売上合計,
avg(D) as 平均受注単価,
count(A) as 案件数,
max(D) as 最大受注額
WHERE E = 'エンタープライズ'
GROUP BY B, C
ORDER BY sum(D) DESC
LABEL sum(D) '売上合計', avg(D) '平均受注単価',
count(A) '案件数', max(D) '最大受注額'",1)
B列が四半期、C列が地域、D列がACVです。この1つの数式で、売上合計3,100万円・平均受注単価217万円・14件・最大受注890万円という地域別×四半期別の完全なサマリーが出力されます。ピボットテーブルで同じ情報を揃えるには4枚のシートを手動更新する必要があります。
PIVOT:集計とクロス集計を組み合わせる
QUERYの PIVOT 句は、集計関数とユニーク値の列展開を同時に処理します。予実管理シートで、費目別・四半期別の支出を把握したい場合の例です。
=QUERY('エクスポージャー'!A:E,
"SELECT B, sum(D)
WHERE C = '実行済'
GROUP BY B
PIVOT A
LABEL sum(D) ''",1)
A列が四半期(Q1〜Q4)、B列が費目、D列が金額です。PIVOT句が四半期を自動的に列方向へ展開します。
PIVOTの出力を下流モデルに安全に接続する方法については、2つのアプローチがあります。
静的レポート向け(取締役会資料など):PIVOTの出力範囲を別シートに =ARRAYFORMULA() で受け取り、そのシートを参照先に固定します。PIVOT構造が変わってもレポートシートのレイアウトは崩れません。
生きたモデル向け(予実管理・KPIダッシュボードなど):PIVOTは使わず、QUERYで縦持ちデータを取得してからSUMIFSで横展開する構造にします。
# 四半期ごとのセルに個別SUMIFS
=SUMIFS('エクスポージャー'!D:D,
'エクスポージャー'!B:B, $A2,
'エクスポージャー'!A:A, B$1,
'エクスポージャー'!C:C, "実行済")
計算が増えますが、列の追加・削除でヘッダーが変わっても下流の数式は壊れません。下流に依存関係がある場合はこちらを推奨します。
LABELとFORMAT句について
どちらも集計列に適用できます。LABEL sum(D) '売上高' は出力ヘッダーを変更します。デフォルトの sum D というヘッダーが残ると、下流のVLOOKUPが参照できなくなるため、実務では必ず設定してください。
FORMAT sum(D) '$#,##0' はクエリ出力に直接数値書式を適用しますが、その列はテキスト型に変換されるため、結果を使って計算を行う数式が壊れます。FORMAT句は表示専用の出力にのみ使用し、計算対象の列には別途セル書式を適用するのが鉄則です。
Google Visualization APIクエリ言語リファレンスには「LABEL句は1つ以上の列のラベルを設定します」と記載されています。文字列リテラルを受け取るこの句は、クエリ文字列内でGROUP BY、PIVOT、ORDER BY、LIMITの後に記述する必要があります。
QUERYにできないこと
モデル設計に直結する制約なので、明示しておきます。
countd()(ユニークカウント)はありません。 =SUMPRODUCT(1/COUNTIF(範囲,範囲)) または補助列で対応してください。
median()(中央値)はありません。 =MEDIAN(IF(...)) を配列数式として使うのが代替手段です。
stdev() や var()(統計集計)はありません。 QUERYでデータを取り出した後、外側でSTDEV()などをラップして使ってください。
ウィンドウ関数はありません。 累計、順位、ラグ・リードには対応していません。補助列か、SCAN/LAMBDAで代替できます。
条件付き集計はありません。 SQLの SUM(CASE WHEN...) パターンは使えません。タブをまたいだSUMIFSで代替してください。例:=SUMIFS('PL'!D:D,'PL'!C:C,"OPEX",'PL'!B:B,">="&前提条件!$B$3)。
よくある質問
Q. QUERYの集計関数は今後追加される予定がありますか?
Google Visualization APIクエリ言語リファレンス(2026年4月時点)には追加予定の記載はなく、過去数年間でも関数のラインナップに変更はありません。新機能が必要な場合はApps ScriptからBigQueryを呼び出す構成か、後述のDuckDB連携が現実的な選択肢です。
Q. GROUP BYなしで集計関数は使えますか?
はい、使えます。=QUERY(A:B,"SELECT sum(B)") のように書けば、列全体の合計を1セルで返します。GROUP BYは複数行に分けてグループ別に集計したい場合にのみ必要です。
Q. 同じQUERYでsum()とcount()を同時に使えますか?
使えます。「複数の集計関数を1つのクエリにまとめる」のセクションにある例のとおり、SELECT句に並べるだけです。それぞれにLABELを設定することを忘れずに。
Q. LABELを設定し忘れるとどうなりますか?
出力列のヘッダーが sum D のような自動生成文字列になります。VLOOKUPやINDEX/MATCHで列を参照している場合、ヘッダーが一致しないためエラーになります。実務では数式に必ずLABELを入れるか、ヘッダー行を別途手動で上書きする運用のどちらかを徹底してください。
Q. QUERY集計関数の計算速度が遅い場合はどうすればよいですか?
参照範囲を必要最小限に絞ることが最初の対策です(A:E ではなく A1:E50000 のように行数を明示)。それでも改善しない場合は、QUERYの出力を中間シートに値貼り付けして更新頻度をコントロールするか、Apps ScriptでBigQueryに処理を移管することを検討してください。
大規模データのタブ間結合や、ウィンドウ関数・countd() などフルのSQLツールキットが必要な場合は、Google SheetsのDuckDB連携が実践的な選択肢になります。
ModelMonkeyのプランを選ぶ — Google SheetsとExcelの両方で動作します。