自動化の相談

関数 · 2026年11月11日

スプレッドシートのQUERY関数の使い方|条件で抽出・集計・並べ替え

Google スプレッドシートの QUERY 関数で、売上の一覧から条件に合う行を抜き出したり、担当者別に集計したり、金額順に並べ替えたりする方法を、コピーして使える式付きで解説します。句を書く順番、文字や日付の条件の書き方、セルの値を条件に使う方法も公式ドキュメントで確かめました。

QUERY関数でできること

売上の一覧から「東京支店の分だけ」を抜き出す、担当者ごとの合計を出す、金額の大きい順に上位 10 件を並べる。フィルタやピボットテーブルでもできる作業ですが、QUERY 関数を使うと 1 つの式で済み、元のデータが増えても結果が自動で変わります。

公式ヘルプでは、Google Visualization API のクエリ言語を使ってデータに問い合わせる関数として説明されています。

=QUERY(データ, クエリ, 見出し)

QUERYの3つの引数

引数意味
データ対象の範囲。例: 売上!A1:E1000
クエリ何をするかを書いた文。" で囲むか、文を入れたセルを指定する
見出し見出しの行数 (省略可)。省略するとデータから推測される
出典:Google ドキュメント エディタ ヘルプ「QUERY 関数」

例に使う売上データ

「売上」シートに、次の形で 1 行に 1 件の売上が入っているとします。

売上シートの形

ABCDE
1日付支店担当者商品金額
22026/11/01東京佐藤保守50000
32026/11/02大阪高橋導入300000
42026/11/05東京田中導入280000

以下の式は、別のシートの A1 に入れる前提です。結果は右と下へ自動で広がります。

条件に合う行を抜き出す (where)

東京支店の行だけを抜き出します。

=QUERY(売上!A1:E1000,"select A, C, D, E where B = '東京'",1)

select で表示する列を、where で条件を書きます。列は A・B のような列の記号で指定します。公式ヘルプのとおり、Col1・Col2 の表記も使えます。

条件の書き方の早見表

whereで使える主な条件

やりたいこと書き方
一致するwhere B = '東京'
一致しないwhere B != '東京'
10 万円以上where E >= 100000
文字を含むwhere D contains '保守'
文字で始まるwhere C starts with '佐'
空でないwhere E is not null
日付以降where A >= date '2026-11-01'
2 つの条件where B = '東京' and E >= 100000
出典:Google Visualization API クエリ言語リファレンス

クエリ言語のリファレンスによると、文字は一重か二重の引用符で囲み、日付は date の後に yyyy-MM-dd 形式の文字を書きます。式全体を " で囲んでいるので、中の文字は ' で囲むと書きやすくなります。また contains などの文字の条件は、大文字と小文字を区別します。

セルの値を条件にする

条件を毎回書き換える代わりに、G1 に支店名を入れて切り替えたいときは、文字をつないでクエリを作ります。

=QUERY(売上!A1:E1000,"select A, C, D, E where B = '"&G1&"'",1)

'"&G1&"' の部分で、G1 の値を ' で囲んだ文字に差し込んでいます。G1 をプルダウンにしておくと、選ぶだけで結果が切り替わる表になります。

担当者ごとに集計する (group by)

担当者ごとの売上の合計を出します。

=QUERY(売上!A1:E1000,"select C, sum(E) where C is not null group by C label sum(E) '売上合計'",1)

sum(E) が合計、group by C が担当者ごとにまとめる指定です。リファレンスによると、集計には sum・avg・count・max・min が使えます。label を付けると、結果の見出しを「sum 金額」から「売上合計」のように変えられます。

集計の式が動く順番

  1. where空の行を除く
  2. group by担当者ごとにまとめる
  3. select担当者と合計を出す
  4. label見出しを付ける
where で行を絞ってから group by でまとめ、最後に見出しを付けます。

支店×担当者の表にする (pivot)

pivot を使うと、列の値を横に並べたクロス集計の表になります。

=QUERY(売上!A1:E1000,"select C, sum(E) where C is not null group by C pivot B",1)

担当者が縦、支店が横に並び、交わるところに合計が入ります。

並べ替えて上位だけ出す (order by / limit)

金額の大きい順に上位 10 件を出します。

=QUERY(売上!A1:E1000,"select A, B, C, E order by E desc limit 10",1)

desc で大きい順、asc (省略可) で小さい順です。

うまく動かないときの確認点

  • 数字の列なのに結果が空になる: 公式ヘルプによると、1 つの列に数字と文字が混ざっていると、多い方の種類として扱われ、少ない方は空 (NULL) になります。金額の列に「未定」などの文字を入れないようにします。
  • 見出しが結果の 1 行目に混ざる・消える: 3 つ目の引数に見出しの行数 (通常は 1) を指定します。
  • 条件の文字が一致しない: 文字の条件は大文字と小文字を区別します。前後の空白にも注意します。

自分で作るのが難しいときは

QUERY は、集計表を 1 つの式で作れる便利な関数ですが、条件が増えると式が長くなり、作った人以外には直せなくなりがちです。複数のシートやファイルをまたいで集計したい、毎朝の数字をチャットに送りたい、といった用途は、GAS で処理を組んだ方が管理しやすくなります。

自分で組むのが難しい、今の集計表が重くて困っている、という場合は、シートナビの相談フォームからお気軽にご相談ください。

よくある質問

QUERY 関数とフィルタ機能はどう使い分けますか?

フィルタは元の表そのものの表示を絞る機能です。QUERY は元の表には手を付けず、別の場所に結果を出します。報告用の集計表を作るなら QUERY、その場で確かめるだけならフィルタが向いています。

別のスプレッドシートのデータに QUERY をかけられますか?

IMPORTRANGE 関数で読み込んだ範囲を、QUERY の 1 つ目の引数に渡せます。列は Col1・Col2 の表記で、読み込んだ範囲の何列目かを指定して書くとわかりやすくなります。例: =QUERY(IMPORTRANGE("URL","売上!A1:E1000"),"select Col1, Col5 where Col2 = '東京'",1)

結果に空の行がたくさん出てしまいます

データの範囲を A1:E1000 のように広めに取ると、まだ入力されていない空の行も対象になります。where A is not null のように空の行を除く条件を足してください。

シートナビ 編集部Excel・Google スプレッドシート・GAS・VBA で仕事を楽にする、そのまま使える手順とテンプレート集

次に読む