QUERY関数でできること
売上の一覧から「東京支店の分だけ」を抜き出す、担当者ごとの合計を出す、金額の大きい順に上位 10 件を並べる。フィルタやピボットテーブルでもできる作業ですが、QUERY 関数を使うと 1 つの式で済み、元のデータが増えても結果が自動で変わります。
公式ヘルプでは、Google Visualization API のクエリ言語を使ってデータに問い合わせる関数として説明されています。
=QUERY(データ, クエリ, 見出し)
QUERYの3つの引数
| 引数 | 意味 |
|---|---|
| データ | 対象の範囲。例: 売上!A1:E1000 |
| クエリ | 何をするかを書いた文。" で囲むか、文を入れたセルを指定する |
| 見出し | 見出しの行数 (省略可)。省略するとデータから推測される |
例に使う売上データ
「売上」シートに、次の形で 1 行に 1 件の売上が入っているとします。
売上シートの形
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | 日付 | 支店 | 担当者 | 商品 | 金額 |
| 2 | 2026/11/01 | 東京 | 佐藤 | 保守 | 50000 |
| 3 | 2026/11/02 | 大阪 | 高橋 | 導入 | 300000 |
| 4 | 2026/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 |
クエリ言語のリファレンスによると、文字は一重か二重の引用符で囲み、日付は 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 金額」から「売上合計」のように変えられます。
集計の式が動く順番
- where空の行を除く
- group by担当者ごとにまとめる
- select担当者と合計を出す
- label見出しを付ける
支店×担当者の表にする (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 のように空の行を除く条件を足してください。



