- クラウドサービス
QUERY関数の使い方|where・group by・日付条件の例文集
QUERY関数とは、Googleスプレッドシートの表に対して「select 列 where 条件 group by 列」のような問い合わせ文を書き、抽出・集計・並べ替えを1つの数式で行う関数です。 構文は QUERY(データ, クエリ, [見出し]) の3つの引数で、2つ目のクエリに書ける句は select・where・group by・pivot・order by・limit・offset・label・format などです。
この記事では、1つの売上表を題材に、句ごとの例文を「数式」と「結果の表」の組で並べます。日付をセル参照で渡す書き方、月別集計、複数条件の一覧、うまく動かないときの対処表も載せました。
確認環境:Google ドキュメント エディタ ヘルプ「QUERY」と、Google Visualization API クエリ言語リファレンスの記載を2026年10月5日に開いて確認しました。結果の表は、同じ抽出・集計を Python 3.11 で求めた値です(行の並びは、order by を指定した例を除いて元の表の順で示しています)。セル参照をつないだクエリ文字列は LibreOffice Calc 24.2 で組み立てて確かめました。
QUERY関数の早見表:句の記述順と役割
クエリの句は、下の表の上から順に書きます。 公式リファレンスに「句の順序は select, where, group by, pivot, order by, limit, offset, label, format, options でなければならない」と書かれており、使わない句は飛ばせますが、順番の入れ替えはできません。
| 記述順 | 句 | 役割 | 例 |
|---|---|---|---|
| 1 | select | 返す列と、その並びを選ぶ | select A, B, F |
| 2 | where | 条件に合う行だけを返す | where C = '東京' |
| 3 | group by | 行をまとめて集計する | select B, sum(F) group by B |
| 4 | pivot | 列の値を新しい列として横に展開する | select D, sum(F) group by D pivot C |
| 5 | order by | 行を並べ替える | order by F desc |
| 6 | limit | 返す行数を制限する | limit 3 |
| 7 | offset | 先頭から指定した行数を飛ばす | offset 3 |
| 8 | label | 列の見出しを付け替える | label sum(F) '金額合計' |
| 9 | format | 列の値の表示書式を指定する | format F '#,##0' |
読み解くときは、「行を絞る(where)→ まとめる(group by・pivot)→ 並べる(order by)→ 件数を切る(limit・offset)→ 見出しと書式を整える(label・format)」の流れで考えると整理できます。記述順と処理の順で向きが変わる点が1つあり、limit と offset を両方書くと、後ろに書いた offset が先に適用されます(公式リファレンスの例では limit 15 offset 30 が31〜45行目を返します)。
よく使う書き方を1行ずつまとめます。
| やりたいこと | クエリの書き方 |
|---|---|
| 列を選ぶ | select A, B, F |
| 文字で絞る | where C = '東京' |
| 数値で絞る | where F >= 3000 |
| 日付で絞る | where A >= date '2026-09-01' |
| セルの日付で絞る | "where A >= date '"&TEXT(H1,"yyyy-mm-dd")&"'" |
| 複数条件 | where C = '東京' and F >= 3000 |
| 空白の行 | where E is null |
| 担当ごとに合計 | select B, sum(F) group by B |
| 縦と横で集計 | select D, sum(F) group by D pivot C |
| 大きい順に上位3件 | order by F desc limit 3 |
| 見出しを付け替える | label sum(F) '金額合計' |
| 桁区切りで表示 | format F '#,##0' |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「QUERY関数の使い方|where・group by・日付条件の例文集」
例文で使う売上表と3つの引数
例文はすべて、同じシートのA1:F13に入っている次の表を対象にします。1行目が見出しで、8行目の数量だけが空白です。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 日付 | 担当 | 地域 | 商品 | 数量 | 金額 |
| 2 | 2026/07/03 | 佐藤 | 東京 | ノート | 10 | 3000 |
| 3 | 2026/07/15 | 鈴木 | 大阪 | ペン | 20 | 2400 |
| 4 | 2026/07/28 | 佐藤 | 東京 | ファイル | 5 | 2500 |
| 5 | 2026/08/02 | 高橋 | 福岡 | ノート | 8 | 2400 |
| 6 | 2026/08/10 | 鈴木 | 大阪 | ノート | 12 | 3600 |
| 7 | 2026/08/21 | 佐藤 | 東京 | ペン | 30 | 3600 |
| 8 | 2026/08/30 | 高橋 | 福岡 | ファイル | 1500 | |
| 9 | 2026/09/05 | 鈴木 | 大阪 | ファイル | 6 | 3000 |
| 10 | 2026/09/12 | 佐藤 | 東京 | ノート | 15 | 4500 |
| 11 | 2026/09/18 | 高橋 | 福岡 | ペン | 25 | 3000 |
| 12 | 2026/09/25 | 鈴木 | 東京 | ノート | 4 | 1200 |
| 13 | 2026/09/30 | 佐藤 | 大阪 | ペン | 10 | 1200 |
シートに貼って試すときは、次のタブ区切りをA1に貼り付けてください。
日付 担当 地域 商品 数量 金額
2026/07/03 佐藤 東京 ノート 10 3000
2026/07/15 鈴木 大阪 ペン 20 2400
2026/07/28 佐藤 東京 ファイル 5 2500
2026/08/02 高橋 福岡 ノート 8 2400
2026/08/10 鈴木 大阪 ノート 12 3600
2026/08/21 佐藤 東京 ペン 30 3600
2026/08/30 高橋 福岡 ファイル 1500
2026/09/05 鈴木 大阪 ファイル 6 3000
2026/09/12 佐藤 東京 ノート 15 4500
2026/09/18 高橋 福岡 ペン 25 3000
2026/09/25 鈴木 東京 ノート 4 1200
2026/09/30 佐藤 大阪 ペン 10 1200
QUERY関数の引数は3つです。
| 引数 | 内容 | 公式ヘルプの記載 |
|---|---|---|
| データ | クエリを実行するセルの範囲 | 各列に指定できるのは、ブール値、数値(日付/時刻など)、文字列の値のみ |
| クエリ | 実行するクエリ | 二重引用符で囲むか、クエリの文字列が入ったセルを参照する |
| 見出し(省略可) | データの上部にある見出し行の数 | 指定しない場合や -1 の場合は、データの内容に基づいて推測される |
この記事の例文は、見出しを推測に任せず、3つ目の引数に 1 を書いています。 数式全体は二重引用符でクエリを囲むので、クエリの中の文字列は一重引用符で囲みます(公式リファレンスでは、文字列は一重引用符と二重引用符のどちらで囲んでもよいとされています)。
select:列を選ぶ
列を選んで並べる
=QUERY(A1:F13, "select A, B, F", 1)
日付・担当・金額の3列が12行返ります。先頭の3行は次のとおりです。
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/07/03 | 佐藤 | 3000 |
| 2026/07/15 | 鈴木 | 2400 |
| 2026/07/28 | 佐藤 | 2500 |
select に書いた順が、返る列の並びになります。 select D, F, B と書けば、商品・金額・担当の順です。select を省略するか select * と書くと、すべての列が元の並びで返ります。
計算した列を足す
select には、四則演算(+、-、*、/)を書けます。7月分について、金額÷数量を「単価」として足す例です。
=QUERY(A1:F13, "select D, E, F, F/E where A < date '2026-08-01' label F/E '単価'", 1)
| 商品 | 数量 | 金額 | 単価 |
|---|---|---|---|
| ノート | 10 | 3000 | 300 |
| ペン | 20 | 2400 | 120 |
| ファイル | 5 | 2500 | 500 |
where:条件で行を絞る
文字・数値の条件
=QUERY(A1:F13, "select * where C = '東京'", 1)
| 日付 | 担当 | 地域 | 商品 | 数量 | 金額 |
|---|---|---|---|---|---|
| 2026/07/03 | 佐藤 | 東京 | ノート | 10 | 3000 |
| 2026/07/28 | 佐藤 | 東京 | ファイル | 5 | 2500 |
| 2026/08/21 | 佐藤 | 東京 | ペン | 30 | 3600 |
| 2026/09/12 | 佐藤 | 東京 | ノート | 15 | 4500 |
| 2026/09/25 | 鈴木 | 東京 | ノート | 4 | 1200 |
=QUERY(A1:F13, "select A, B, D, F where F >= 3000", 1)
| 日付 | 担当 | 商品 | 金額 |
|---|---|---|---|
| 2026/07/03 | 佐藤 | ノート | 3000 |
| 2026/08/10 | 鈴木 | ノート | 3600 |
| 2026/08/21 | 佐藤 | ペン | 3600 |
| 2026/09/05 | 鈴木 | ファイル | 3000 |
| 2026/09/12 | 佐藤 | ノート | 4500 |
| 2026/09/18 | 高橋 | ペン | 3000 |
文字列は一重引用符で囲み、数値は囲みません。 比較に使える記号は =、!=、<>、<、<=、>、>= です。
複数条件の一覧(and・or・not・contains・matches・is null)
条件の書き方と、売上表に当てはめたときの行数を一覧にします。
| やりたいこと | where の書き方 | 行数 |
|---|---|---|
| AかつB | where C = '東京' and F >= 3000 |
3 |
| AまたはB | where C = '福岡' or F >= 3600 |
6 |
| (AまたはB)かつC | where (C = '東京' or C = '大阪') and D = 'ノート' |
4 |
| Aではない | where not C = '東京' |
7 |
| AでもBでもない | where C != '東京' and D != 'ペン' |
4 |
| 範囲(以上・以下) | where E >= 10 and E <= 20 |
5 |
| 文字を含む | where D contains 'ァ' |
3 |
| 文字で始まる | where D starts with 'ノ' |
5 |
| 文字で終わる | where D ends with 'ン' |
4 |
| 正規表現に一致 | where D matches 'ノ.+' |
5 |
| ワイルドカード(0文字以上) | where D like 'フ%' |
3 |
| ワイルドカード(1文字) | where B like '_藤' |
5 |
| 空白 | where E is null |
1 |
| 空白ではない | where E is not null and E < 8 |
3 |
代表的な3つについて、返る表も示します。
=QUERY(A1:F13, "select A, B, D, F where C = '東京' and F >= 3000", 1)
| 日付 | 担当 | 商品 | 金額 |
|---|---|---|---|
| 2026/07/03 | 佐藤 | ノート | 3000 |
| 2026/08/21 | 佐藤 | ペン | 3600 |
| 2026/09/12 | 佐藤 | ノート | 4500 |
=QUERY(A1:F13, "select A, C, D, F where (C = '東京' or C = '大阪') and D = 'ノート'", 1)
| 日付 | 地域 | 商品 | 金額 |
|---|---|---|---|
| 2026/07/03 | 東京 | ノート | 3000 |
| 2026/08/10 | 大阪 | ノート | 3600 |
| 2026/09/12 | 東京 | ノート | 4500 |
| 2026/09/25 | 東京 | ノート | 1200 |
=QUERY(A1:F13, "select * where E is null", 1)
| 日付 | 担当 | 地域 | 商品 | 数量 | 金額 |
|---|---|---|---|---|---|
| 2026/08/30 | 高橋 | 福岡 | ファイル | 1500 |
and と or を混ぜるときは、かっこで囲んで組み合わせをはっきりさせます。 空白かどうかは、= '' ではなく is null、is not null で調べます。
contains と matches と like の違い
| 演算子 | 一致のしかた | 例 | 結果 |
|---|---|---|---|
| contains | 文字が途中にあれば一致 | D contains 'ー' |
ノートの5行 |
| matches | 正規表現に全体が一致 | D matches 'ー' |
0行 |
| matches | 同上 | D matches '.*ー.*' |
ノートの5行 |
| like | % は0文字以上、_ は1文字 | D like 'フ%' |
ファイルの3行 |
matches は部分一致ではありません。公式リファレンスにも、'.*ia' は India に一致し、'an' は Canada に一致しないという例が載っています。途中に含むものを探すなら contains を使うか、前後に .* を付けます。
複数の候補のどれかに一致させたいときは、正規表現の縦棒が使えます。
=QUERY(A1:F13, "select A, C, D where D matches 'ノート|ペン' and C = '福岡'", 1)
| 日付 | 地域 | 商品 |
|---|---|---|
| 2026/08/02 | 福岡 | ノート |
| 2026/09/18 | 福岡 | ペン |
日付条件:date リテラル・セル参照・月別集計
date リテラルで絞る
日付は、date 'yyyy-MM-dd' の形で書きます。公式リファレンスには、キーワード date に続けて yyyy-MM-dd 形式の文字列を書くと定められています。
=QUERY(A1:F13, "select A, B, F where A >= date '2026-09-01'", 1)
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/09/05 | 鈴木 | 3000 |
| 2026/09/12 | 佐藤 | 4500 |
| 2026/09/18 | 高橋 | 3000 |
| 2026/09/25 | 鈴木 | 1200 |
| 2026/09/30 | 佐藤 | 1200 |
期間は、2つの条件を and でつなぎます。
=QUERY(A1:F13, "select A, B, F where A >= date '2026-08-01' and A <= date '2026-08-31'", 1)
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/08/02 | 高橋 | 2400 |
| 2026/08/10 | 鈴木 | 3600 |
| 2026/08/21 | 佐藤 | 3600 |
| 2026/08/30 | 高橋 | 1500 |
日時は datetime 'yyyy-MM-dd HH:mm:ss'、時刻は timeofday 'HH:mm:ss' と書きます。
セルの日付を TEXT 関数で渡す
開始日をH1、終了日をI1に入れて、数式を書き換えずに期間を変えられるようにします。TEXT関数で yyyy-mm-dd の文字列に変えてから、& でクエリにつなぎます。
=QUERY(A1:F13, "select A, B, F where A >= date '"&TEXT(H1,"yyyy-mm-dd")&"' and A <= date '"&TEXT(I1,"yyyy-mm-dd")&"'", 1)
H1に2026/08/01、I1に2026/08/31を入れて、2つ目の引数の部分だけを LibreOffice Calc で組み立てると、次の文字列になりました。前の例のクエリと同じ文になっています。
select A, B, F where A >= date '2026-08-01' and A <= date '2026-08-31'
TEXT関数を通さずに "... date '"&H1&"'" とつなぐと、同じ確認で次の文字列になりました。日付のセルは中身が連番の数値なので、yyyy-MM-dd の形になりません。
select A where A >= date '46235'
つないだ結果がどんな文字列になるかは、クエリの部分だけを別のセルに書いて表示すると確かめられます。 うまく動かないときは、まずこの方法で文を見るのが近道です。
文字や数値のセルも同じ考え方でつなぎます。J1に「東京」、K1に3000が入っているときの例です。文字は一重引用符で囲み、数値は囲みません。
=QUERY(A1:F13, "select A, D, F where C = '"&J1&"' and F >= "&K1, 1)
組み立てた文字列は次のとおりです。
select A, D, F where C = '東京' and F >= 3000
年・月・曜日で絞る
日付から年や月を取り出す関数があります。month は0始まりで、1月が0、7月は6です。
| 関数 | 返す値 |
|---|---|
| year(A) | 年 |
| month(A) | 月(1月が0、2月が1…) |
| day(A) | 日 |
| quarter(A) | 四半期(1〜4) |
| dayOfWeek(A) | 曜日(日曜が1、月曜が2…) |
=QUERY(A1:F13, "select A, B, F where year(A) = 2026 and month(A) = 6", 1)
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/07/03 | 佐藤 | 3000 |
| 2026/07/15 | 鈴木 | 2400 |
| 2026/07/28 | 佐藤 | 2500 |
金曜日(6)の行だけを取り出す例です。
=QUERY(A1:F13, "select A, B, F where dayOfWeek(A) = 6", 1)
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/07/03 | 佐藤 | 3000 |
| 2026/08/21 | 佐藤 | 3600 |
| 2026/09/18 | 高橋 | 3000 |
| 2026/09/25 | 鈴木 | 1200 |
月別に集計する
year と month は group by にも書けます。
=QUERY(A1:F13, "select year(A), month(A), sum(F), count(A) group by year(A), month(A) label year(A) '年', month(A) '月(0始まり)', sum(F) '金額合計', count(A) '件数'", 1)
| 年 | 月(0始まり) | 金額合計 | 件数 |
|---|---|---|---|
| 2026 | 6 | 7900 | 3 |
| 2026 | 7 | 11100 | 4 |
| 2026 | 8 | 12900 | 5 |
月が6・7・8と出るのは0始まりのためで、7月・8月・9月のことです。1〜12の月で見せたいときは、元の表に「年月」の列を足す方法がわかりやすくなります。 G1に「年月」、G2に次の式を入れて13行目までコピーします。
=TEXT(A2,"yyyy-mm")
A列が2026/08/01のとき、この式は LibreOffice Calc で 2026-08 を返しました。範囲をG列まで広げて、年月で集計します。
=QUERY(A1:G13, "select G, sum(F) group by G label sum(F) '金額合計'", 1)
| 年月 | 金額合計 |
|---|---|
| 2026-07 | 7900 |
| 2026-08 | 11100 |
| 2026-09 | 12900 |
group by:グループごとに集計する
集計に使える関数は5つです。
| 関数 | 返す値 | 対象の型 |
|---|---|---|
| sum() | 合計 | 数値 |
| avg() | 平均 | 数値 |
| count() | 件数(空白のセルは数えない) | すべて |
| max() | 最大 | すべて |
| min() | 最小 | すべて |
担当ごとの合計
=QUERY(A1:F13, "select B, sum(F) group by B order by sum(F) desc label sum(F) '金額合計'", 1)
| 担当 | 金額合計 |
|---|---|
| 佐藤 | 14800 |
| 鈴木 | 10200 |
| 高橋 | 6900 |
複数の集計を並べる
=QUERY(A1:F13, "select B, count(A), avg(F), max(F), min(F) group by B order by count(A) desc label count(A) '件数', avg(F) '平均金額', max(F) '最大', min(F) '最小'", 1)
| 担当 | 件数 | 平均金額 | 最大 | 最小 |
|---|---|---|---|---|
| 佐藤 | 5 | 2960 | 4500 | 1200 |
| 鈴木 | 4 | 2550 | 3600 | 1200 |
| 高橋 | 3 | 2300 | 3000 | 1500 |
where で絞ってから集計する
=QUERY(A1:F13, "select D, sum(F) where C = '東京' group by D order by sum(F) desc label sum(F) '金額合計'", 1)
| 商品 | 金額合計 |
|---|---|
| ノート | 8700 |
| ペン | 3600 |
| ファイル | 2500 |
count は空白を数えない
=QUERY(A1:F13, "select C, count(A), count(E) group by C label count(A) '日付の件数', count(E) '数量の件数'", 1)
| 地域 | 日付の件数 | 数量の件数 |
|---|---|---|
| 東京 | 5 | 5 |
| 大阪 | 4 | 4 |
| 福岡 | 3 | 2 |
福岡は3行ありますが、数量が空白の行が1つあるので count(E) は2です。行数を数えたいときは、空白の無い列を count に渡します。
group by の決まり
select に書く列は、group by に書いた列か、集計関数で包んだ列のどちらかにします。 select B, C, sum(F) group by B のように、どちらでもない列(C)を混ぜると成り立ちません。C も見たいときは group by B, C とします。
pivot:値を横に並べて集計する
pivot は、指定した列の値を新しい列として横に展開します。下の表の列見出しは、展開した値の部分だけを示しています(公式リファレンスには、見出しは pivot 列の値・集計の種類・集計した列の見出しから組み立てられると書かれています)。
1行にまとめる
=QUERY(A1:F13, "select sum(F) pivot C", 1)
| 東京 | 大阪 | 福岡 |
|---|---|---|
| 14800 | 10200 | 6900 |
group by と組み合わせてクロス集計にする
=QUERY(A1:F13, "select D, sum(F) group by D pivot C", 1)
| 商品 | 東京 | 大阪 | 福岡 |
|---|---|---|---|
| ノート | 8700 | 3600 | 2400 |
| ペン | 3600 | 3600 | 3000 |
| ファイル | 2500 | 3000 | 1500 |
=QUERY(A1:F13, "select B, sum(F) group by B pivot D", 1)
| 担当 | ノート | ペン | ファイル |
|---|---|---|---|
| 佐藤 | 7500 | 4800 | 2500 |
| 鈴木 | 4800 | 2400 | 3000 |
| 高橋 | 2400 | 3000 | 1500 |
pivot に書いた列は、select・group by・order by には書けません。 縦に並べる列を group by に、横に並べる列を pivot に、と分けて書きます。
order by・limit・offset:並べ替えと件数
大きい順に上位3件
=QUERY(A1:F13, "select A, B, D, F order by F desc, A limit 3", 1)
| 日付 | 担当 | 商品 | 金額 |
|---|---|---|---|
| 2026/09/12 | 佐藤 | ノート | 4500 |
| 2026/08/10 | 鈴木 | ノート | 3600 |
| 2026/08/21 | 佐藤 | ペン | 3600 |
降順は desc を付けます。カンマで区切ると、2つ目以降のキーを指定できます。この例では金額が同じ行が複数あるので、2つ目のキーに日付を足して、並びを1通りに決めています。
4〜6件目を取り出す
=QUERY(A1:F13, "select A, B, D, F order by F desc, A limit 3 offset 3", 1)
| 日付 | 担当 | 商品 | 金額 |
|---|---|---|---|
| 2026/07/03 | 佐藤 | ノート | 3000 |
| 2026/09/05 | 鈴木 | ファイル | 3000 |
| 2026/09/18 | 高橋 | ペン | 3000 |
offset 3 で先頭の3行を飛ばし、そこから limit 3 で3行を取ります。書く順番は limit が先、offset が後です。
新しい順に3件
=QUERY(A1:F13, "select A, B, F order by A desc limit 3", 1)
| 日付 | 担当 | 金額 |
|---|---|---|
| 2026/09/30 | 佐藤 | 1200 |
| 2026/09/25 | 鈴木 | 1200 |
| 2026/09/18 | 高橋 | 3000 |
order by には、列のほかに sum(F) のような集計関数の結果も書けます(group by の例を参照)。
label・format:見出しと表示書式
label で見出しを付け替える
書き方は label 列 '見出し' で、複数あるときはカンマで区切ります。
=QUERY(A1:F13, "select B, sum(F), count(A) group by B order by sum(F) desc label B '担当者', sum(F) '売上合計', count(A) '件数'", 1)
| 担当者 | 売上合計 | 件数 |
|---|---|---|
| 佐藤 | 14800 | 5 |
| 鈴木 | 10200 | 4 |
| 高橋 | 6900 | 3 |
集計した列は、select に書いたのと同じ形(sum(F) など)で指定します。
format で表示書式を指定する
書き方は format 列 '書式' です。数値は #,##0 や #,##0.00、日付は yyyy/MM/dd のようなパターンで指定します。
=QUERY(A1:F13, "select A, F where A < date '2026-08-01' format A 'MM/dd', F '#,##0'", 1)
| 日付 | 金額 |
|---|---|
| 07/03 | 3,000 |
| 07/15 | 2,400 |
| 07/28 | 2,500 |
=QUERY(A1:F13, "select B, avg(F) group by B order by avg(F) desc label avg(F) '平均金額' format avg(F) '#,##0.0'", 1)
| 担当 | 平均金額 |
|---|---|
| 佐藤 | 2,960.0 |
| 鈴木 | 2,550.0 |
| 高橋 | 2,300.0 |
label と format を両方書くときは、label が先、format が後です。
見出し引数・型の混在・Col表記:うまく動かないときの対処表
公式ヘルプには、エラーメッセージごとの説明は載っていません。そこで、ヘルプとクエリ言語リファレンスに書かれている決まりをもとに、症状から原因をたどる表にまとめます。
| 症状 | 考えられる原因 | 公式の記載 | 対処 |
|---|---|---|---|
| 見出しの行がデータとして扱われる、またはデータの1行目が見出しに入る | 見出しの行数が推測に任されている | 見出しを指定しない場合や -1 の場合は、データの内容に基づいて推測される | 3つ目の引数に見出しの行数を書く(1行なら 1、見出しが無ければ 0) |
| 数値の列なのに一部の値が空白で返る、条件や集計に入らない | 1つの列に数値と文字が混ざっている | 1つの列に異なる種類のデータがある場合、多数を占める種類が使われ、少数の種類は NULL 値とみなされる | 列の中の型をそろえる。「10個」のような文字や、文字として入った数字を数値に直す |
| 日付の条件で結果が返らない | 日付の書き方が date 'yyyy-MM-dd' の形になっていない | date に続けて yyyy-MM-dd 形式の文字列を書く | date リテラルで書く。セル参照は TEXT(セル,"yyyy-mm-dd") を通す |
| 月の条件が1か月ずれる | month が0始まり | month() は1月に0、2月に1を返す | 7月なら month(A) = 6 と書く。または年月の列を足す |
| matches で途中の文字が拾えない | 全体が一致するかで判定される | 'an' は Canada に一致しない | contains を使うか、前後に .* を付ける |
| 集計のクエリが成り立たない | select に、group by にも集計関数にも無い列がある | select の列は、group by に書くか集計関数で包む | 列を group by に足すか、select から外す |
| pivot のクエリが成り立たない | pivot の列を select や group by にも書いている | pivot の列は select・group by・order by に書けない | pivot の列をほかの句から外す |
| 句を足すと成り立たなくなる | 句の順番が決まりと違う | 順序は select, where, group by, pivot, order by, limit, offset, label, format | 早見表の順に並べ直す |
| 文字の条件が成り立たない | 文字列を引用符で囲んでいない | 文字列リテラルは一重または二重の引用符で囲む | C = '東京' のように一重引用符で囲む |
| 空白の行を拾えない | = '' で比べている | null との比較は is null、is not null で行う | where E is null と書く |
| 列の文字を数え間違える | 範囲がA列から始まっていない、複数の範囲をつないでいる | QUERY は「Col」表記または「A, B」表記を受け付ける | 左から数えた Col1、Col2 で書く |
Col表記の書き方
Col表記は、データの左端の列を Col1 として、左から順に番号で指定する書き方です。A1:F13 なら、Col1 が日付、Col3 が地域、Col6 が金額にあたります。
=QUERY(A1:F13, "select Col2, sum(Col6) where Col3 = '東京' group by Col2 label sum(Col6) '金額合計'", 1)
| 担当 | 金額合計 |
|---|---|
| 佐藤 | 13600 |
| 鈴木 | 1200 |
データの範囲がシートの途中の列から始まるときや、波かっこで複数の範囲をつないだものをデータに渡すときは、列の文字よりも「左から何番目か」のほうが数えやすくなります。そうした場面では Col表記に切り替えると、列の指定を取り違えにくくなります。1つのクエリの中では、A, B 表記と Col表記のどちらかにそろえて書きます。
型が混ざった列の見つけ方
数値の列に文字が混ざっているかどうかは、列の隣で =ISNUMBER(E2) を下までコピーすると見分けられます。FALSE になった行が、数値として入っていないセルです。日付の列も中身は数値なので、同じ方法で確かめられます。
よくある質問
Q. クエリが長くなって読みにくいときは?
A. クエリの文字列を別のセルに書き、2つ目の引数でそのセルを参照できます。公式ヘルプにも QUERY(A2:E6,F2,FALSE) という例があります。セルに文が見えるので、条件をつないだ結果の確認にも使えます。
Q. 条件のセルが空のときは、すべての行を返したい場合は?
A. IF関数でクエリの文字列を切り替えます。IF(J1="", "select *", "select * where C = '"&J1&"'") を2つ目の引数に書くと、J1が空のときは条件なしの文になります。
Q. 英字の大文字と小文字を区別せずに比べるには?
A. クエリ言語には、文字列を大文字にする upper() と小文字にする lower() があり、where にも書けます。where lower(B) = 'sato' のように、列の側を小文字にそろえてから比べます。
まとめ
- QUERY関数は
QUERY(データ, クエリ, [見出し])。見出しの行数は推測に任せず、3つ目の引数に書くと安定する - 句は select → where → group by → pivot → order by → limit → offset → label → format の順に書く
- 文字列は一重引用符、日付は
date 'yyyy-MM-dd'で書く。セルの日付は TEXT(セル,"yyyy-mm-dd") を通してつなぐ - 複数条件は and・or とかっこで組み立てる。部分一致は contains、全体の正規表現は matches、空白は is null
- group by では、select の列を group by に書くか集計関数で包む。count は空白を数えない
- month は0始まり。月別集計は year と month で group by するか、年月の列を足す
- 1つの列に型が混ざると、少数の型は NULL 値とみなされる。ISNUMBER で混在を見つけて型をそろえる
参考・出典
- Google ドキュメント エディタ ヘルプ「QUERY」 https://support.google.com/docs/answer/3093343?hl=ja
- Google Charts「Query Language Reference (Version 0.7)」 https://developers.google.com/chart/interactive/docs/querylanguage
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「QUERY関数の使い方|where・group by・日付条件の例文集」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。