QUERY関数の使い方|抽出・集計・並べ替えを1つの数式で

執筆者:

カテゴリ:

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 を付けていない
  • – 列名の間違い(ACol1 の取り違え)
  • 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特有の挙動で、原因が分かりにくいトラブルです。元データの型を揃えるか、selecttoText() を使ってください。

FILTERとの使い分け

やりたいこと 使う関数
条件で行を絞るだけ FILTER
絞る+集計・グループ化 QUERY
絞る+並べ替え+上位N件 QUERY
条件が複雑(部分一致・正規表現) どちらでも

単純な絞り込みは FILTER のほうが読みやすいです。集計が入った瞬間にQUERYへ切り替えてください。

まとめ

  • – 書式は =QUERY(範囲, "クエリ文", 見出し行数)
  • 文字列はシングルクォート、日付は date 'yyyy-mm-dd'
  • – 列名は、直接指定なら A、経由すると Col1
  • group by集計表が1行で作れる
  • 第3引数(見出し行数)は必ず指定する
  • – Excelには存在しない、スプレッドシート固有の関数

関連する関数

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です