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は、他の関数とはまったく毛色が違います。データベースへの問い合わせに使われる言語の一部を、表計算の中で書けるようにしたものです。抽出、集計、並べ替え、グループ化を一本の数式で書けるため、複数の関数を組み合わせる必要がなくなります。
この特徴は利点と欠点の両方を持ちます。利点は、複雑な処理を短く書けることです。担当者ごとに売上を集計して降順に並べ、上位十件だけを表示する、といった処理が一行で済みます。同じことを他の関数で書こうとすると、集計、重複除去、並べ替え、切り出しを組み合わせることになります。
欠点は、書き方を別に覚える必要があることです。関数の引数ではなく、文字列として書いた命令文を渡す形になります。表計算の関数の常識が通じない部分があり、最初は戸惑います。また、エラーが出たときのメッセージが分かりにくく、どこが間違っているのか特定しづらいという難点もあります。
したがって、使いどころを選ぶ関数です。日常的な抽出や集計であれば、他の関数のほうが読みやすく保守しやすくなります。QUERYが向いているのは、集計とグループ化が絡む処理、条件が複雑な抽出、そして同じ処理を何度も書き直す可能性が低い定型のレポートです。
列の指定でつまずくところ
QUERYで最初につまずくのが、列の指定方法です。列名ではなく、範囲の中での列の位置をアルファベットで指定します。
ここで重要なのは、そのアルファベットが「シートの列名」を指しているのか「範囲の中での順番」を指しているのかという点です。範囲をA列から指定していれば両者は一致しますが、C列から始まる範囲を指定した場合、範囲の一列目はCではなくAとして扱われます。ここを取り違えると、想定と違う列が返ります。
対処としては、範囲をA列から指定するか、範囲の中での位置を意識して書くかのどちらかです。後から範囲を変更する可能性があるなら、A列から指定しておくほうが混乱が少なくなります。
もうひとつ、見出し行の扱いも指定が必要です。何行目までが見出しかを引数で指定できます。指定しないと自動判定になりますが、判定が意図と違うことがあります。集計結果に見出しが混ざったり、逆に一行目のデータが見出しとして消えたりします。明示的に指定するのが確実です。
見出しを含めた場合、結果にも見出しが付いて返ります。不要な場合は、見出しの数をゼロとして指定するか、表示のラベルを空にする指定を追加します。
条件の書き方
条件は、抽出を意味する語の後ろに書きます。列の指定と比較演算子を組み合わせる形で、感覚としてはIFの条件式に近いものがあります。
文字列を比較する場合、値をシングルクォートで囲みます。数式全体がダブルクォートで囲まれているため、内側にはシングルクォートを使う、という関係になります。ここを間違えると、数式そのものが成立しません。
条件を別のセルから取ってくる場合は、文字列を連結する形になります。数式の途中で連結記号を使い、セル参照を挟み込みます。この書き方は読みにくくなりがちなので、条件が複雑になるなら、条件用の文字列を別のセルで組み立ててから参照するほうが管理しやすくなります。
日付を条件にする場合は、専用の書き方が必要です。日付を表す語の後ろに、決まった形式の文字列を置きます。セルの日付をそのまま連結しても正しく解釈されないため、書式を整える関数で変換してから渡します。ここは他の関数と比べて手間がかかる部分です。
かつで結ぶ場合とまたはで結ぶ場合の書き方もあります。括弧で優先順位を指定できるので、複雑な条件も表現できます。ただし、複雑になるほど読み手の負担が増えます。
集計とグループ化
QUERYがもっとも力を発揮するのが、グループ化を伴う集計です。指定した列の値ごとにまとめて、合計や件数や平均を出せます。
担当者ごとの売上合計、月ごとの件数、商品分類ごとの平均単価。こうした集計が一本の数式で書けます。しかも元データが増えれば結果も自動で更新されます。ピボットテーブルと似た結果を、数式として得られるのが利点です。
集計した結果を並べ替えることもできます。合計の大きい順に並べれば、そのままランキング表になります。さらに件数を絞れば、上位のみを表示できます。
注意点として、集計した列には自動的にラベルが付きます。合計を意味する語が見出しに含まれる形です。これが不要な場合は、ラベルを空にする指定を追加します。
もうひとつ、集計対象の列に文字列が混ざっていると、正しく集計されないことがあります。数値として扱われるべき列に文字列が入っていないか、事前に確認してください。
よくある質問
Q. エラーの内容が分かりません
命令文の書き方に誤りがあります。まず条件をすべて外して単純な抽出だけにし、動作を確認してから一つずつ足していくと原因を特定できます。
Q. 列の指定が想定と違います
範囲の開始列を確認してください。範囲の中での位置で指定されるため、A列から始まっていないとずれます。
Q. 見出しが結果に混ざります
見出しの行数を明示的に指定してください。自動判定では意図と違うことがあります。
Q. 日付の条件が効きません
日付を表す専用の書き方が必要です。書式を整える関数で変換してから渡してください。
Q. 数値の列が集計されません
列に文字列が混ざっている可能性があります。列全体の型を揃えてください。
Q. Excelでも使えますか
スプレッドシート専用の関数です。Excelでは使えません。共有する相手の環境を確認してください。
Q. 他の関数で代替できますか
抽出はFILTER、集計はSUMIFS、並べ替えはSORT、重複除去はUNIQUEで代替できます。組み合わせは長くなりますが、読みやすさでは勝ります。
Q. 重くなることはありますか
対象範囲が大きいと負荷がかかります。特に他のファイルから読み込んだデータに対して使う場合は、必要な範囲に絞ってから渡してください。
まとめ
- 書式は
=QUERY(範囲, "クエリ文", 見出し行数) - 文字列はシングルクォート、日付は
date 'yyyy-mm-dd' - 列名は、直接指定なら
A、経由するとCol1 group byで集計表が1行で作れる- 第3引数(見出し行数)は必ず指定する
- Excelには存在しない、スプレッドシート固有の関数
関連する関数
- FILTER — 単純な絞り込み
- SORT — 並べ替え
- IMPORTRANGE — 別ファイルのデータを取り込む
- SUMIFS — 条件付き合計(QUERYで置き換えられることが多い)
- 関数一覧に戻る
