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

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

<Points>

- QUERY は `=QUERY(範囲, "select ... where ...", 1)` の形で、1 つの式で抽出・集計・並べ替えができる
- 句は select → where → group by → pivot → order by → limit → label の順に書く。順番を間違えるとエラーになる
- 文字の条件は `'東京'` のように引用符で、日付は `date '2026-11-01'` の形で書く

</Points>

## QUERY関数でできること

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

[公式ヘルプ](https://support.google.com/docs/answer/3093343?hl=ja)では、Google Visualization API のクエリ言語を使ってデータに問い合わせる関数として説明されています。

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

<Figure title="QUERYの3つの引数" source="Google ドキュメント エディタ ヘルプ「QUERY 関数」">

| 引数 | 意味 |
|---|---|
| データ | 対象の範囲。例: `売上!A1:E1000` |
| クエリ | 何をするかを書いた文。`"` で囲むか、文を入れたセルを指定する |
| 見出し | 見出しの行数 (省略可)。省略するとデータから推測される |

</Figure>

## 例に使う売上データ

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

<Figure title="売上シートの形">

| | A | B | C | D | E |
|---|---|---|---|---|---|
| 1 | 日付 | 支店 | 担当者 | 商品 | 金額 |
| 2 | 2026/11/01 | 東京 | 佐藤 | 保守 | 50000 |
| 3 | 2026/11/02 | 大阪 | 高橋 | 導入 | 300000 |
| 4 | 2026/11/05 | 東京 | 田中 | 導入 | 280000 |

</Figure>

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

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

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

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

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

### 条件の書き方の早見表

<Figure title="whereで使える主な条件" source="Google Visualization API クエリ言語リファレンス">

| やりたいこと | 書き方 |
|---|---|
| 一致する | `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` |

</Figure>

[クエリ言語のリファレンス](https://developers.google.com/chart/interactive/docs/querylanguage)によると、文字は一重か二重の引用符で囲み、日付は `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 金額」から「売上合計」のように変えられます。

<Flow
  title="集計の式が動く順番"
  caption="where で行を絞ってから group by でまとめ、最後に見出しを付けます。"
  steps={[
    { label: "where", note: "空の行を除く" },
    { label: "group by", note: "担当者ごとにまとめる" },
    { label: "select", note: "担当者と合計を出す" },
    { label: "label", note: "見出しを付ける" },
  ]}
/>

### 支店×担当者の表にする (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` (省略可) で小さい順です。

<Note tone="caution">

句の順番は決まっています。リファレンスでは select、where、group by、pivot、order by、limit、offset、label、format、options の順に書くと定められています。`order by` を `where` より前に書くとエラーになります。

</Note>

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

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

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

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

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

## よくある質問

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

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

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

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

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

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