「売上データから東京支店だけ抽出して、金額順に並べ替えて、部署ごとの合計も出したい」。こんなふうに、やりたいことが増えてくると関数を何段も重ねることになりますよね。
VLOOKUP・FILTER・SORT を組み合わせれば対応できますが、数式がどんどん長くなって読みにくくなります。
そんなときに使えるのが QUERY関数 です。SQLに似た命令文を1つの関数にまとめて書けるので、抽出・並べ替え・集計を一発で処理できます。
この記事では、基本の書き方からGROUP BY・PIVOTまで、実務データを使ってわかりやすく解説します。
QUERY関数とは?
QUERY関数(クエリ関数)は、SQLに似た命令文でデータを操作できるGoogleスプレッドシート専用の関数です。
英語の「query(問い合わせ)」が名前の由来で、データベースに対して「こういうデータをちょうだい」と問い合わせるイメージです。
たとえば、次のようなことが1つの数式でできます。
- 特定の列だけを取り出す(SELECT)
- 条件に合う行だけに絞り込む(WHERE)
- データを並べ替える(ORDER BY)
- グループごとに集計する(GROUP BY)
- 取得件数を制限する(LIMIT)
NOTE
QUERY関数はGoogleスプレッドシート専用です。Excelには同じ関数は存在しません。ExcelではFILTER関数やピボットテーブルで同様の処理を行います。
QUERY関数の書き方(構文と引数)
基本構文
=QUERY(データ, クエリ, [見出し])
引数の説明
| 引数 | 必須/任意 | 説明 |
|---|---|---|
| データ | 必須 | 検索対象のセル範囲(例: A1:E100) |
| クエリ | 必須 | SQL風の命令文を文字列で記述(例: "SELECT A, B") |
| 見出し | 任意 | データの先頭にある見出し行の数。省略すると自動判定 |
第2引数の「クエリ」がこの関数のキモです。ダブルクォーテーション " " の中にSQL風の命令を書きます。
列の指定には A, B, C… のアルファベットを使います。データ範囲の左端列が A、2列目が B…という対応です。
TIP
「SQLなんて知らない」と思った方もご安心ください。使う命令は
SELECT(選ぶ)・WHERE(絞る)・ORDER BY(並べる)くらいです。英単語の意味そのままなので、すぐ慣れます。
QUERY関数の基本的な使い方
ここでは、次のような売上データ(A1:E6)を使って説明します。
| 担当者 | 支店 | 部署 | 商品 | 金額 |
|---|---|---|---|---|
| 田中 | 東京 | 営業部 | プランA | 50000 |
| 鈴木 | 大阪 | 営業部 | プランB | 30000 |
| 佐藤 | 東京 | 企画部 | プランA | 45000 |
| 山田 | 名古屋 | 営業部 | プランC | 20000 |
| 高橋 | 大阪 | 企画部 | プランB | 60000 |
SELECT|列を選んで取り出す
全5列のうち「担当者」と「金額」だけが欲しい場合は次のように書きます。
=QUERY(A1:E6, "SELECT A, E")
A列(担当者)とE列(金額)だけが取り出されます。見出し行もそのまま含まれるのが便利なポイントです。
全列を取得したい場合は SELECT * と書きます。
=QUERY(A1:E6, "SELECT *")
WHERE|条件でデータを絞り込む
「東京支店だけ」に絞り込むには、WHERE句を使います。
=QUERY(A1:E6, "SELECT * WHERE B = '東京'")
文字列の条件はシングルクォーテーション ' ' で囲むのがルールです。ダブルクォーテーションではないので注意してください。
数値の条件はそのまま書けます。
=QUERY(A1:E6, "SELECT * WHERE E >= 40000")
金額が40,000円以上のデータだけが出力されます。
複数条件(AND / OR)
条件を組み合わせるには AND や OR を使います。
=QUERY(A1:E6, "SELECT * WHERE B = '東京' AND E >= 40000")
東京支店 かつ 金額40,000円以上の行だけが返ります。
=QUERY(A1:E6, "SELECT * WHERE B = '東京' OR B = '大阪'")
東京 または 大阪の行が返ります。
部分一致(contains / starts with / ends with)
「プラン」を含む商品を探したい場合は contains を使います。
=QUERY(A1:E6, "SELECT * WHERE D contains 'プラン'")
前方一致は starts with、後方一致は ends with です。
ORDER BY|並べ替える
金額の大きい順に並べたい場合は ORDER BY に DESC(降順)を付けます。
=QUERY(A1:E6, "SELECT * ORDER BY E DESC")
小さい順(昇順)は ASC です。省略すると昇順になります。
複数列で並べ替えることもできます。
=QUERY(A1:E6, "SELECT * ORDER BY B ASC, E DESC")
支店名の昇順で並べてから、同じ支店内では金額の降順になります。
LIMIT|取得件数を制限する
上位3件だけ取り出したいときは LIMIT を使います。
=QUERY(A1:E6, "SELECT * ORDER BY E DESC LIMIT 3")
ORDER BY と組み合わせれば「金額トップ3」のような使い方ができます。
QUERY関数の応用テクニック
GROUP BY|グループごとに集計する
支店ごとの売上合計を出すには、GROUP BY と集計関数 sum() を組み合わせます。
=QUERY(A1:E6, "SELECT B, sum(E) GROUP BY B")
結果はこのようになります。
| 支店 | sum 金額 |
|---|---|
| 大阪 | 90000 |
| 名古屋 | 20000 |
| 東京 | 95000 |
使える集計関数は次の5つです。
| 集計関数 | 説明 |
|---|---|
sum(列) | 合計 |
avg(列) | 平均 |
count(列) | 件数 |
max(列) | 最大値 |
min(列) | 最小値 |
WHERE + GROUP BY の組み合わせ
営業部だけの支店別合計を出したい場合はこう書きます。
=QUERY(A1:E6, "SELECT B, sum(E) WHERE C = '営業部' GROUP BY B")
WHERE で先に絞り込んでから GROUP BY で集計する流れです。
PIVOT|クロス集計する
「支店ごと × 部署ごと」のクロス集計を作るには PIVOT を使います。
=QUERY(A1:E6, "SELECT B, sum(E) GROUP BY B PIVOT C")
行が支店、列が部署の集計表が一発で出力されます。Excelのピボットテーブルに近い機能を、数式だけで実現できるのが強みです。
LABEL|列見出しを変更する
GROUP BY の結果は見出しが sum 金額 のようになります。わかりにくい場合は LABEL で書き換えましょう。
=QUERY(A1:E6, "SELECT B, sum(E) GROUP BY B LABEL sum(E) '売上合計'")
LABEL 列指定 '表示名' の形式で指定します。
FORMAT|表示形式を指定する
金額にカンマ区切りを付けたい場合は FORMAT を使います。
=QUERY(A1:E6, "SELECT A, E FORMAT E '#,##0'")
表示形式のコードは、セルの表示形式設定と同じ書き方です。
複数の句を組み合わせる
QUERY関数の真価は、複数の句を1つの数式にまとめられる点です。
=QUERY(A1:E6, "SELECT B, sum(E) WHERE E >= 30000 GROUP BY B ORDER BY sum(E) DESC LABEL sum(E) '売上合計'")
この1行で「金額30,000円以上のデータを支店ごとに集計し、合計の大きい順に並べ替え、見出しも整える」ができます。
NOTE
句の記述順序は決まっています。SELECT → WHERE → GROUP BY → PIVOT → ORDER BY → LIMIT → OFFSET → LABEL → FORMAT → OPTIONS の順に書いてください。順番を間違えるとエラーになります。
セル参照をクエリに埋め込む
条件をセルの値で動的に切り替えたい場合は、文字列結合を使います。
たとえば G1 セルに支店名が入っているとします。
=QUERY(A1:E6, "SELECT * WHERE B = '"&G1&"'")
"SELECT * WHERE B = '" と "'" の間に &G1& を挟む形です。ちょっとむずかしく見えますが、やっていることはシンプルです。クエリ文字列の中にセルの値を差し込んでいるだけです。
TIP
プルダウンと組み合わせると、選択した値に応じてデータが自動で切り替わるダッシュボードが作れます。プルダウンの作り方は スプレッドシートのプルダウン作り方|色付け・連動まで解説 を参考にしてください。
QUERY関数でよくあるエラーと対処法
| エラー | 主な原因 | 対処法 |
|---|---|---|
#VALUE! | クエリ文字列の構文エラー | 引用符の閉じ忘れ、句の順序誤りを確認する |
#REF! | 出力先に既存データがある | 出力先の下方向に空きスペースを確保する |
#N/A | 該当データが0件 | WHERE条件を確認する。IFERROR で空表示にできる |
| ヘッダーが2行出る | 第3引数(見出し)の指定ミス | =QUERY(A1:E6, "...", 1) のように明示指定する |
| 文字列条件が効かない | シングルクォーテーション忘れ | 文字列は '値' で囲む(ダブルクォーテーション不可) |
| 日付の比較が効かない | 日付の書き方が違う | date '2026-01-01' の形式で書く |
日付をWHEREで使うときの注意
日付を条件にする場合は date 'yyyy-MM-dd' という特別な書き方が必要です。
=QUERY(A1:E100, "SELECT * WHERE A > date '2026-01-01'")
セル参照で日付を指定する場合は TEXT 関数で変換します。
=QUERY(A1:E100, "SELECT * WHERE A > date '"&TEXT(G1,"yyyy-MM-dd")&"'")
VLOOKUP・FILTER・SORTとの使い分け
QUERY関数は万能ですが、シンプルな処理なら他の関数のほうが手軽です。使い分けの目安をまとめました。
| やりたいこと | おすすめの関数 | 理由 |
|---|---|---|
| 1つの値を検索して返す | VLOOKUP | 構文がシンプルで直感的 |
| 条件に合う行を抽出する | FILTER | 配列を返すので一覧表示に向く |
| データを並べ替える | SORT / SORTN / SORTBY | 並べ替え専用で高速 |
| 重複を除いた一覧を出す | UNIQUE | 1つの関数で完結する |
| 抽出 + 並べ替え + 集計を一括 | QUERY | 複数の処理を1つの数式にまとめられる |
| クロス集計表を作りたい | QUERY(PIVOT句) | ピボットテーブルを数式で実現できる |
TIP
迷ったら「やりたいことが2つ以上あるか?」で判断してみてください。抽出だけならFILTER、並べ替えだけならSORT。でも「抽出して並べ替えて集計もしたい」なら、QUERY関数の出番です。
まとめ
QUERY関数は、Googleスプレッドシートで使える最強のデータ操作関数です。
この記事で紹介した句を振り返っておきましょう。
| 句 | 役割 | 使用例 |
|---|---|---|
| SELECT | 列を選ぶ | SELECT A, B, E |
| WHERE | 条件で絞る | WHERE B = '東京' |
| ORDER BY | 並べ替える | ORDER BY E DESC |
| LIMIT | 件数を制限 | LIMIT 10 |
| GROUP BY | グループ集計 | GROUP BY B |
| PIVOT | クロス集計 | PIVOT C |
| LABEL | 見出し変更 | LABEL sum(E) '合計' |
| FORMAT | 表示形式 | FORMAT E '#,##0' |
まずは SELECT と WHERE だけで十分です。慣れてきたら GROUP BY や PIVOT にも挑戦してみてください。
データ操作の効率がぐっと上がりますよ。
