QUERYは、SQLに近い書き方で、抽出・集計・並べ替えを1つの数式で行える関数です。
Googleスプレッドシート最強の関数と言われます。FILTER + SORT + SUMIF + ピボットテーブルを1本にまとめたようなもので、慣れると他の関数を書く場面が減ります。
Excelにはありません。 スプレッドシート固有の関数です。
書式
=QUERY(データ範囲, "クエリ文", [見出し行数])
| 引数 | 内容 |
|---|---|
| データ範囲 | 元の表 |
| クエリ文 | "select ... where ..." を文字列で書く |
| 見出し行数 | 見出しが1行なら 1。必ず指定するのが安全 |
列の指定方法
ここが最初のつまずきどころです。
| 状況 | 列の書き方 |
|---|---|
| シート内の範囲を直接指定 | A, B, C(列名) |
IMPORTRANGE や {} を経由 |
Col1, Col2, Col3 |
同じ表でも、渡し方によって書き方が変わります。 Col1 と書くべきところで A と書くとエラーになります。
基本の使い方
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 日付 | 支店 | 商品 | 売上 |
| 2 | 2026/4/3 | 東京 | A | 1200 |
| 3 | 2026/4/8 | 大阪 | A | 800 |
| 4 | 2026/5/2 | 東京 | B | 1500 |
列を選ぶ(select)
=QUERY(A:D, "select B, D", 1)
支店と売上だけを取り出します。列の順番も自由に変えられます(select D, B)。
すべての列なら select * です。
条件で絞る(where)
=QUERY(A:D, "select * where B = '東京'", 1)
文字列はシングルクォート ' で囲みます。 クエリ全体がダブルクォートなので、中はシングルです。
数値はクォート不要です。
=QUERY(A:D, "select * where D >= 1000", 1)
複数条件は and / or でつなぎます。
=QUERY(A:D, "select * where B = '東京' and D >= 1000", 1)
部分一致は like を使います。% が任意の文字列です。
=QUERY(A:D, "select * where B like '%営業%'", 1)
正規表現なら matches です。
=QUERY(A:D, "select * where B matches '東京|大阪'", 1)
並べ替える(order by)
=QUERY(A:D, "select * order by D desc", 1)
desc が降順、asc(省略可)が昇順です。
件数を絞る(limit)
=QUERY(A:D, "select * order by D desc limit 5", 1)
売上トップ5が1行で書けます。
集計する(group by)
QUERYの真価はここです。
=QUERY(A:D, "select B, sum(D) group by B", 1)
支店ごとの売上合計が一度に出ます。SUMIF を支店の数だけ並べる必要がありません。
使える集計関数:sum() avg() count() max() min()
複数をまとめて出せます。
=QUERY(A:D, "select B, sum(D), count(D), avg(D) group by B order by sum(D) desc", 1)
支店別の売上・件数・平均を、売上順で並べた集計表が1行で完成します。
クロス集計(pivot)
=QUERY(A:D, "select B, sum(D) group by B pivot C", 1)
行に支店、列に商品を置いたクロス集計表になります。ピボットテーブルを数式で作れるわけです。
日付を条件にする
QUERYで最も引っかかるのがここです。 日付は専用の書き方が要ります。
=QUERY(A:D, "select * where A >= date '2026-04-01'", 1)
date を付け、形式は yyyy-mm-dd に固定です。2026/4/1 では動きません。
セルの日付を使う場合は、文字列に変換して連結します。
=QUERY(A:D, "select * where A >= date '" & TEXT(F1, "yyyy-mm-dd") & "'", 1)
引用符の入れ子が複雑ですが、この形を覚えてしまうのが早いです。
期間で絞るなら2つ並べます。
=QUERY(A:D, "select * where A >= date '2026-04-01' and A < date '2026-05-01'", 1)
見出しの扱い
第3引数を省略すると、スプレッドシートが見出し行を推測します。推測が外れると結果がずれるので、必ず明示してください。
- – 見出しが1行 →
1 - – 見出しなし →
0
集計結果の見出しを自分で付けたいなら label を使います。
=QUERY(A:D, "select B, sum(D) group by B label B '支店', sum(D) '売上合計'", 1)
見出しを消したいなら空文字にします。
... label sum(D) ''
IMPORTRANGEと組み合わせる
別ファイルのデータを絞り込んで取り込めます。この組み合わせが実務では最も強力です。
=QUERY(IMPORTRANGE("キー", "売上!A:D"), "select Col2, sum(Col4) group by Col2", 1)
列名が Col1, Col2... になる点に注意してください。A, B では動きません。
よくあるエラー
「解析エラー」「PARSE_ERROR」
クエリ文の書き方が不正です。多い原因:
- – 文字列をシングルクォートで囲んでいない(
where B = 東京) - – 日付に
dateを付けていない - – 列名の間違い(
AとCol1の取り違え) - –
group byに、select で挙げた非集計列が入っていない
select B, D group by B はエラーになります。集計していない D をグループ化に含めていないためです。select B, sum(D) group by B が正しい形です。
「値がありません」「不明な列」
Col1 と書くべきところで A と書いています。IMPORTRANGE や {} を経由したら Col 形式です。
結果が1件も返らない
- – 文字列の前後にスペースが入っている
- – 数値が文字列になっている(
where D >= 1000が効かない) - – 日付の形式が違う
数値の列に文字列が混ざると片方が消える
QUERYは列ごとに型を推測します。数値と文字列が混在する列は、多いほうの型に揃えられ、少数派が空白になります。
これはQUERY特有の挙動で、原因が分かりにくいトラブルです。元データの型を揃えるか、select で toText() を使ってください。
FILTERとの使い分け
| やりたいこと | 使う関数 |
|---|---|
| 条件で行を絞るだけ | FILTER |
| 絞る+集計・グループ化 | QUERY |
| 絞る+並べ替え+上位N件 | QUERY |
| 条件が複雑(部分一致・正規表現) | どちらでも |
単純な絞り込みは FILTER のほうが読みやすいです。集計が入った瞬間にQUERYへ切り替えてください。
まとめ
- – 書式は
=QUERY(範囲, "クエリ文", 見出し行数) - – 文字列はシングルクォート、日付は
date 'yyyy-mm-dd' - – 列名は、直接指定なら
A、経由するとCol1 - –
group byで集計表が1行で作れる - – 第3引数(見出し行数)は必ず指定する
- – Excelには存在しない、スプレッドシート固有の関数
関連する関数
- – FILTER — 単純な絞り込み
- – SORT — 並べ替え
- – IMPORTRANGE — 別ファイルのデータを取り込む
- – SUMIFS — 条件付き合計(QUERYで置き換えられることが多い)
- – 関数一覧に戻る
コメントを残す