Googleスプレッドシートの QUERY関数の使い方(SQL風の書き方でよくあるエラーも解説)

「QUERY関数、SQLに似てるって聞いたから使ってみたけど、エラーばっかり出て心が折れそう…」そんな経験はないでしょうか。

QUERY関数はSELECT・WHERE・ORDER BYといったSQL風の書き方で、大量のデータを自由自在に抽出・集計できる強力な関数です。

ただし「SQL風」であるがゆえに、他のスプレッドシート関数とは違うクセがあり、そこでつまずく人が多い傾向にあります。

この記事では、QUERY関数の基本的な使い方から、セル参照や日付を条件にする応用テクニック、そして初心者が特にハマりやすいエラーとその対処法まで、会話形式で解説していきます。

QUERY関数って何?基本の書き方を教えて!

リュージ、QUERY関数っていうのがすごく便利って聞いたんだけど、普通の関数と何が違うの?

QUERY関数は、データベースでよく使われるSQLという言語に似た書き方で、データの抽出・並べ替え・集計を1つの関数でまとめてできるのが特徴なんだ。構文はこう。「=QUERY(範囲,”クエリ”,見出し行数)」。

「クエリ」の部分に何を書けばいいのかがイメージつかないんだけど…。

まずは3つだけ覚えれば十分。「SELECT」で表示したい列を選び、「WHERE」で条件を指定し、「ORDER BY」で並べ替える。例えば「東京支店」のデータだけ、売上が高い順に表示したいなら「=QUERY(A1:C10,”SELECT A,C WHERE A=’東京支店’ ORDER BY C DESC”,1)」のように書くよ。

あれ、条件のところ「’東京支店’」ってシングルクォーテーションで囲まれてる。IF関数とかは「”東京支店”」ってダブルクォーテーションだったよね?

そこ、本当にいいところに気づいたね。実はそれがQUERY関数の一番のクセなんだ。QUERY関数のクエリ全体はダブルクォーテーションで囲むんだけど、その中で文字列の値を指定するときはシングルクォーテーションを使う、というルールになっている。他の関数の感覚のままダブルクォーテーションを使うと、エラーになってしまうんだ。

QUERY関数は「=QUERY(範囲,"クエリ",見出し行数)」という構文で、クエリ部分にSQLに似た書き方をする。まずは表示する列を選ぶ「SELECT」、条件を指定する「WHERE」、並べ替える「ORDER BY」の3つを覚えれば多くの場面に対応できる。他のスプレッドシート関数と違い、クエリ内で文字列の値を指定する際はダブルクォーテーションではなくシングルクォーテーションを使う点が最大の注意点である。

条件をセル参照にしたいんだけど、うまく書けない…

「東京支店」って直接書くんじゃなくて、別のセルに入力した支店名を条件にしたいんだけど、どう書けばいいの?

それ、QUERY関数で一番つまずきやすいポイントなんだ。クエリ全体は文字列(ダブルクォーテーションで囲まれた1つのテキスト)として扱われるから、セル参照をそのまま中に書いても、ただの文字として認識されてしまう。だから、クエリの文字列をいったん区切って、「&」でセル参照をつなぎ合わせる必要があるんだ。

具体的にはどう書くの…?想像がつかない。

D1セルに支店名が入っているとすると、こう書くよ。「=QUERY(A1:C10,”SELECT A,C WHERE A='”&D1&”‘”,1)」。分解すると、「”SELECT A,C WHERE A='”」で一度クエリ文字列を閉じて、「&D1&」でセル参照をつなぎ、また「”‘”」で文字列を再開して閉じている。

クォーテーションが何重にもなっててややこしい…!これ、覚えるコツとかある?

「セル参照の前後は、必ずシングルクォーテーション1つをダブルクォーテーションで挟んだ形(”‘)にする」と定型文として覚えてしまうのがおすすめ。一度この型を作ってしまえば、あとはコピーして条件部分だけ書き換えれば、いろんな場面で使い回せるよ。

QUERY関数の条件をセル参照にしたい場合、クエリ文字列を「"」でいったん閉じ、「&」でセル参照をつなぎ、再び「"」で文字列を開始するという書き方が必要になる。文字列条件の場合は、セル参照の前後をシングルクォーテーション「'」で挟む必要があるため、「"...='"&セル&"'"」という形を定型として覚えておくと、様々な場面に応用しやすい。

日付で絞り込みたいんだけど、思い通りの結果にならない

「2026年1月1日以降のデータ」みたいに、日付で絞り込みたいときはどう書けばいいの?普通に日付を入れてもうまくいかなくて…。

それも見落とされがちなポイント。日付を条件にするときは、「date」というキーワードを先頭につけて、「date ‘2026-01-01’」のように西暦から順に「-(ハイフン)」区切りで書く必要があるんだ。「=QUERY(A1:C10,”SELECT * WHERE A>=date ‘2026-01-01′”,1)」のように使うよ。

「2026/1/1」みたいな日本でよく見る書き方は使えないの?

QUERY関数のクエリ言語では、スラッシュ区切りではなく、ハイフン区切りの「date ‘yyyy-mm-dd’」という決まった書き方をする必要がある。ここは「そういう決まりごと」として覚えてしまうのが早いよ。日付をセル参照で指定したい場合は、さっきのセル参照のテクニックと組み合わせて「date ‘”&TEXT(D1,”yyyy-mm-dd”)&”‘」のように、TEXT関数で書式を整えてから連結するのが確実だね。

QUERY関数で日付を条件にする場合、「date 'yyyy-mm-dd'」というハイフン区切りの特殊なリテラル形式を使う必要がある。日本でよく使われるスラッシュ区切りの表記は使えない点に注意したい。セル参照の日付を条件にしたい場合は、TEXT関数で「yyyy-mm-dd」形式の文字列に変換してから、セル参照の連結テクニックと組み合わせるとよい。

GROUP BYで集計しようとしたら、エラーになった…

支店ごとの売上合計を出したくて、GROUP BYを使ってみたんだけど、エラーになっちゃった。「=QUERY(A1:C10,”SELECT A,B,SUM(C) GROUP BY A”,1)」って書いたんだけど…。

あ、それはGROUP BYを使うときの重要なルールに引っかかっているね。GROUP BYで集計するときは、SELECTに書いた列のうち、SUMなどの集計関数を使っていない列は、必ずGROUP BYの中にも同じように含めないといけないんだ。

今回の場合だと、SELECTに「A」「B」「SUM(C)」って書いてるけど、GROUP BYには「A」しか入れてないから、Bの部分でエラーになってるってこと?

その通り。「B」列は集計されずにそのまま表示しようとしているのに、GROUP BYでは「A」ごとにしかグループ化していない。これだと「グループ化されたA1件に対して、Bの値がどれになるべきか」をシステムが判断できなくてエラーになるんだ。対処法は2つ。1つは「B」もGROUP BYに追加すること、もう1つはそもそも「B」をSELECTから外すことだよ。

じゃあ「支店ごとの合計」だけが欲しいなら、「=QUERY(A1:C10,”SELECT A,SUM(C) GROUP BY A”,1)」ってシンプルに書けばいいんだね。

その通り、完璧だよ。あとGROUP BYを使うときは、集計した列の見出し名が「sum C」のような機械的な表示になりがちだから、「LABEL」句を使って「LABEL SUM(C) ‘売上合計’」のように見出しを分かりやすく変更しておくのもおすすめだよ。

QUERY関数でGROUP BYを使う際は、SELECTに指定した列のうち、集計関数(SUMなど)を使っていない列は、必ずGROUP BYの中にも同じように含める必要がある。含まれていない列があるとエラーになるため、対処法としては該当の列をGROUP BYに追加するか、SELECTから除外するかのいずれかを選ぶ。また、集計列の見出しが機械的な表示になる場合は、「LABEL」句を使って分かりやすい見出し名に変更できる。

まとめ:QUERY関数の使い方&エラー対処 早見表

やりたいこと・困りごと書き方・対処法
基本構文=QUERY(範囲,”クエリ”,見出し行数)
列を選んで表示SELECT A,C のように列記号を指定
条件で絞り込むWHERE A=’東京支店’(文字列はシングルクォーテーション)
並べ替えるORDER BY C DESC(降順)/ASC(昇順)
セル参照を条件にしたい“…='”&セル参照&”‘” の形で連結する
日付で絞り込みたいdate ‘yyyy-mm-dd’ のハイフン区切り形式を使う
GROUP BYでエラーになるSELECTの非集計列は必ずGROUP BYにも含める
集計列の見出しを変えたいLABEL SUM(C) ‘見出し名’ を追加する

クォーテーションの使い分けとGROUP BYのルール、この2つを知らなかったら永遠にエラーと格闘してたと思う…。定型文として覚えて、あとは使い回すようにするよ。

QUERY関数は「SQL風」というだけあって、独特のクセがある分、一度型を覚えてしまえば一気に応用が利くようになる関数だよ。まずはSELECT・WHERE・ORDER BYの基本から慣れて、必要になったらセル参照や日付、GROUP BYに挑戦していくのがおすすめだね。

QUERY関数は、SELECT・WHERE・ORDER BYといったSQL風の書き方でデータを抽出・並べ替えできる強力な関数である。文字列条件はシングルクォーテーションで囲む、セル参照は「&」で連結する、日付条件は「date 'yyyy-mm-dd'」形式で書くといった独特のルールを押さえることが習得のカギになる。GROUP BYを使う際は、SELECTの非集計列を必ずGROUP BYにも含める必要がある点にも注意したい。

関連記事

  1. Googleスプレッドシートの SUMIF・COUNTIF関数の使い方(条件範囲の指定ミスも解説)

  2. スプレッドシートで自分だけフィルタをかける方法!スマホでの注意点も解説

  3. スプレッドシートで「あの人が何を編集したか」を確認する方法

  4. スプレッドシートでグラフを作る方法!どの種類を選べばいいかも解説

  5. Googleフォームの回答をスプレッドシートに自動反映させる方法|集計・グラフ化のコツも

  6. スプレッドシート特有のエラー表示(#N/A、#ERROR!)の解説

  7. スプレッドシートのショートカット、覚えて本当に速くなる?挫折しない覚え方も解説

  8. Googleスプレッドシートのフィルタ機能の使い方(「フィルタ」と「フィルタ表示」の違いも解説)

  9. スプレッドシートのオーナー変更、やり方と「できない」時の原因を解説