Googleスプレッドシート QUERY関数 超応用例 5(select句 徹底解析)
Googleスプレッドシートの最強関数 QUERY関数について書いたnoteの第5回です。
👇これまでのQUERY関数シリーズは マガジンにまとめています。
ちなみに QUERY関数シリーズの前回は QUERY関数の slect句を使った超応用例(というより曲芸)、他のセルに入れた計算式の文字列を計算させる eval的というかExcelの EVALUATE的なテクニックを紹介しました。
先週のnoteでは QUERY関数ではなく テーブル機能のアップデートについてまとめています。
QUERY関数の select句の基本
今回は
QUERY(データ, クエリ, [見出し])
QUERY関数の 3つの引数の2番目、第2引数のクエリ構文、その中でも 最初に登場する select句について 徹底解析していきます。

基本の使い方から注意点、超応用例まで、どこよりも詳しい(はず)!(超応用例は次回となります)
一部 QUERY関数シリーズの第3回 「Googleスプレッドシート QUERY関数 超応用例 3(第2引数 クエリ文を理解する)」と重複する部分もありますが、重要なポイントとなるので再確認を!
まず今回はselect句の基本を理解しましょう。超応用例は次回となります。
なお、日付や日時、時刻のQUERY関数での取り扱いは少し独特なので、これらを扱うケースについては、今回は触れず別でまとめたいと思います。
select句は 出力する列を指定する句
クエリ文の select句は 第1引数で指定したデータ から、結果として出力する列とその順序を指定する為の句です。
select句を使うことで、第1引数のデータから欲しい列だけを欲しい順番で出力することが出来ます。
まずは select句で列を指定する時の7つのポイントをまとめました。
select句の記述方法は、 Col1,Col2..と列番号を指定する方式と
列のアルファベット A,B.. を指定する方式あるselect句で 指定する列は大文字、小文字に注意する必要がある
select句は省略が可能。省略時は select * と一緒
select句の列指定は1つ1つ、範囲指定が出来ない
select句はクエリ文の先頭に書く(クエリ文は順序が大事)
select句は出力する列の順番を指定できる
select句は同じ列を何度も指定できない
それぞれ解説していきましょう。
1. select句の記述方法は、 Col1,Col2..と列番号を指定する方式と列のアルファベット A,B.. を指定する方式ある
クエリ文では 列を指定する文字列を「ID(識別子)」と言うのですが、GoogleスプレッドシートのQUERY関数のクエリ文の場合は
列を列のアルファベットで指定 A,B,C…
QUERY関数の第1引数が セル範囲(同じスプレッドシート内)の時
列を列番号で指定 Col1,Col2…
QUERY関数の第1引数が セル範囲、配列 どちらでもOK
※複数の列を指定する場合は、カンマ( , )で区切って記述する。
この2通りの書き方があります。
2025年4月現在、テーブル機能の構造化参照( テーブル名[見出し名] )をクエリ文で使うことは出来ません。
2つの記述方法を具体例でみていきましょう。
たとえば以下の左側の5列のデータから、「営業担当者」と「製品」と「売上」の3つの列のデータだけをQUERY関数で出力したい場合、

営業担当者 ・・・ A列
製品 ・・・ C列
売上 ・・・ E列
とみて
=QUERY(A1:E23,"select A,C,E")
このように記述する方法と

営業担当者 ・・・ データ内の1列目 Col1
製品 ・・・ データ内の3列目 Col3
売上 ・・・ データ内の5列目 Col5
とみて
=QUERY(A1:E23,"select Col1,Col3,Col5")
このように記述する方法と2通りあります。
記述ルールの
・第2引数 クエリ文を式内に記述する場合は全体を " ダブルクォートで括る
・select の後ろに半角スペースを入れる
👆これはどちらも共通です。
2つの書き方の使い分けとしては、以前は QUERY関数の第1引数が
同じスプレッドシート内の範囲(別シートもOK)の場合
▶ select A,B,C… で指定
別スプレッドシートからIMPORTRANGEで参照したデータなど配列の場合
▶ select Col1,Col2,Col3… で指定
このように範囲の時は A,B,Cという列のアルファベット指定、配列の場合は Col1,Col2,Col3 という列番号指定 いう使いわけでした。
しかし 2023年7月以降は
同じスプレッドシート内の範囲(別シートもOK)の場合
▶ select A,B,C… で指定
▶ select Col1,Col2,Col3… で指定 両方使える
別スプレッドシートからIMPORTRANGEで参照したデータなど配列の場合
▶ select Col1,Col2,Col3… で指定 のみ
このように変更されており、今までエラーとなっていた 範囲に対しても Col1,Col2 という記述が可能となりました。
※「範囲」とは同じスプレッドシート内(別シートも可)のセル範囲を関数や数式を挟まず、そのまま指定したものを指します。(※例外としてINDEXなど一部「範囲」を返す関数があります)
というわけで、 select句で エラーとなるケースは、

このように第1引数が 配列 {A1:E23} の場合に、 select句で A,C,E と列のアルファベット指定をしてしまった時です。
この時
関数 QUERY のパラメータ 2 のクエリ文字列を解析できません。NO_COLUMN: A
というメッセージで #VALUE! エラーが返ります。
つまり 範囲にしか使えない 列のアルファベット指定よりも、範囲と配列の両方に使える 列番号指定の方が 使い勝手がよいってことです。
ただし、列のアルファベット (A) なら1文字で指定できるところを Col1と4文字使って指定することになるので、どうしても式が長くなりがちですし、あれ?これ何列目となることもあります。
同じシート範囲を対象とする簡単なQUERY式であれば 列のアルファベットを利用した方が良いケースもあると覚えておきましょう。
とりあえず、QUERYとセットで使うことの多い IMPORTRANGEを使って別のスプレッドシートから持ってきたデータを第1引数とする場合は、第1引数は 配列 である為、必ず Col1,Col2.. 指定を使う必要があるということです。

Col1,Col2指定ですが、この列番号はあくまで第1引数のデータの 一番左の列を1としてカウントした番号であって、A列が1、B列が2というものでは無いってことに注意しましょう。

上の画像のように データの範囲である 第1引数を B:F としているのに、A列から1,2,3と数えて F列だから6番目だと Col6 と指定すると、B~F つまり 1~5までしか列がないのに 6番目を指定しているのでエラーとなります。
mir的には、配列・範囲の両方で使えて、元データの位置を気にせず記述できて、さらに次回紹介する「selct句のテキストを 数式で生成」で使える Col1,Col2..の列番号指定をなるべく利用して慣れることをお勧めします!
2. select句で 指定する列は大文字、小文字に注意する必要がある
これも前回触れましたが、列を指定する識別子(ID)は大文字、小文字を明確に区別するので注意が必要です。
クエリ文の select や where は 大文字小文字は気にせず SELECT や WHERE としても問題ありません。

しかし、列を指定する A や C といった列のアルファベットは必ず大文字を使う、列番号の場合は Col1,Col2 と頭のCは大文字で ol は小文字を使うという厳密なルールがあります。
これを a,c,e のように列アルファベットを小文字指定してしまったり、

Col1,Col3を col1 とか COL3と 全部小文字、または全部大文字にして記述してしまうと

このようにエラーとなります。
また、
select と 列指定の識別子の間にスペースがない
半角でなく全角スペースで区切ってしまう
複数列の指定でカンマで区切らずスペースで区切ってしまう

というミスもやりがちなので注意です。
さらに列数の多いデータを扱うケースでは、列のアルファベット指定を利用していた場合、BY列が登場した際に 予約語の by とみなされエラーとなるケースもあります。
この点でも Col1,Col2… 指定をお勧めします。
3. select句は省略が可能。省略時は select * と一緒
特に出力する列を絞り込んだり、並び順を変更する必要がなく、第1引数のデータの列の並びそのままで出力したい場合は、
select *
と記述することで、全ての列をそのままの並びで出力することが出来ます。
ただ、これは select句を省略した時と同じ結果になるので、あえて select * を記述する必要はありません

つまり
=QUERY(A1:E23,"select * where Col3 = '製品B'")
👆の式は
=QUERY(A1:E23,"where Col3 = '製品B'")
👆のように select * を省略してOK
ってことです。
mirは省略する派ですが、明示的に select * と記述しても問題ありません。
4. select句の列は1つずつ指定する。範囲指定は出来ない

QUERY関数の select句で列を指定する場合は、必ずカンマ区切りで一つずつ指定しなければなりません。
たとえば 👆の画像のように A-Jの10列のデータからQUERY関数のselect句で 1列目を除いた 2列目から10列目(B-Z) だけを出力したい場合でも、
✖ =QUERY(A1:J11,"select B to J")
や
✖ =QUERY(A1:J11,"select Col2-Col10")
のように 範囲をまとめて記述することは出来ません。
これが出来たらかなり便利なんですけどね。
ちなみに Col2-Col10 としてしまうと - がマイナスと見なされ、この後紹介する 列同士の演算子による計算を(2列目から10列目を減算)しようとします。(画像の例だと文字列型の列に対して算術演算子を使おうとしてるのでエラーとなっています)
じゃあ、最初から第1引数の範囲を A1:J11ではなく、B1:J11と指定すれば良いのでは?と考えますが、QUERY関数内で A列は出力はしたくないけど、
・where句で 出力する行を絞り込む条件にA列を使いたい
・order by 句で並べ替えのキー列にA列を使いたい
といった場合は第1引数にA列を含んでおく必要があります。
面倒でも

=QUERY(A1:J11,"select B,C,D,E,F,G,H,I,J")
または
=QUERY(A1:J11,"select Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10")
と記述する必要があるってことです。
でも、これが20列、30列と増えた場合は大変ですよね。この列指定の文字列を数式で生成するテクニックがあります!
これを次回の超応用例では紹介したいと思います。
5. select句はクエリ文の先頭に書く(クエリ文は順序が大事)
公式にも書いていますが、

言語句は記述する順番にルールがあります。
先ほどの式のように select と where を記述する場合は、かならず selectが1番目で where は2番目である必要があります。(省略は可)
順番を無視して記述してしまうと「こんなところで select が出てくるのはおかしいだろ!」とエラーになります。

6. select句は出力する列の順番を指定(並び替え)できる

select句は 出力する列を選択して絞り込むだけではなく、列を出力する順番、つまり左側からの列の並び順を指定することが出来ます。
=QUERY(A1:E23,"select Col3,Col5,Col1")
たとえば このように select Col3,Col5,Col1 という順番で指定した場合は、列の並びを 3, 5, 1 列目の順番とすることが出来ます。
7. select句は同じ列を何度も指定できない

列を抜粋し、並び順も操作できる select句ですが 「同じ列を複数回指定する」ことは出来ません。
たとえば
=QUERY(A1:E23,"select Col1,Col1")
や
=QUERY(A1:E23,"select A,A,A")
といった式で Col1 (A) を複数回出力しようとしても
エラー
関数 QUERY のパラメータ 2 のクエリ文字列を解析できません。COLUMN_ONLY_ONCE: Col1
とエラーが返ります。
COLUMN_ONLY_ONCE と記載がある通り、列は1回しか使えないってことですね。
まぁクエリ文がデータベースを基としていることを考えると、同じ名前(見出し)の列が存在できないのは当然なんでしょうが、加工の都合上これがやりたい時もあるので困ります。
一応回避策があるので、これは次回紹介します。
CHOOSECOLS関数と QUERY関数の select句
QUERY関数の select句が、対象のデータ(範囲または配列)から、指定した列だけを出力したり、並びを変えたりできる ことはわかりました。
でも、これって今だと CHOOSECOLS関数に似てって思いませんか?
CHOOSECOLS関数は、2023年3月頃に ExcelからGoogleスプレッドシートに輸入された割と新しい関数です。
CHOOSECOLS(配列, 列番号 1, [列番号 2])
QUERY関数の select句と同じように、第1引数の配列(範囲)から抽出する列番号を指定して、指定した順に並び替えて出力ができます。

=CHOOSECOLS(A1:E23,3,5,1)
さらに QUERY関数の select句では出来なかった

=CHOOSECOLS(A1:E23,1,1,1,1)
同じ列を複数回指定して何度も出力させることも可能。
さらにさらに、マイナス指定で後ろ(一番右の列)から〇列目といった指定も出来ます。

=CHOOSECOLS(A1:E23,-1,-2)
列の指定部分は配列指定もOKなので、SEQUENCE関数と組み合わせて

=CHOOSECOLS(A1:E23,SEQUENCE(5,1,5,-1))
列の並びを反転させる(列を逆順に並び替え)なんてことも簡単。
QUERY関数の select句みたいに Col1,Col2と、いちいち'Col'を付ける必要がないのも良いですね。
数値だけで指定できて、同じ列の複数回指定や、マイナスで反対から指定、さらにSEQUENCEで生成した配列でも指定出来るとは・・・ 、さすがに列操作に特化した関数だけあって CHOOSECOLSは便利です。
というわけで、単純に元データから 特定の列だけ抽出したり、列を指定した順に並び替えたりだけであれば、現在は CHOOSECOLS関数を使うべきです。
ただし、CHOOSECOLS関数があれば select句は不要、というわけではありません。
この後記述していきますが、QUERY関数の select句は 列を指定した上で 演算子を使って列同士の計算結果を出力をしたり、スカラー関数で 列のデータを成形したり、さらに集計関数で列毎に集計したりと、多数の合わせ技で大活躍する重要な句です。
基本の列指定に続いて、この合わせ技を見ていきましょう!
QUERY関数の select句と合わせ技で出来ること
select句の基本では、第1引数のデータから 指定した列のみを出力や、指定した順に列を並べ替え ができることを学びました。
それ以外に select句と合わせ技で出来ることを見ていきましょう。
select句と合わせ技で出来ること、その注意点
select句では単純に第1引数のデータから列を指定するだけでなく、合わせて 列の集計、加工、計算が出来ます。
さらに直接値を指定した列の生成も出来るのが面白い点です。
まとめると QUERY関数 select句の合わせ技は この4つです。
集計関数で列を集計
スカラー関数で列を加工
演算子で列を計算
値指定で列を生成
これらを利用する際、勝手に見出しが生成されてしまうという注意点があります。

残念ながら生成される見出しを制御する方法はなく、生成された上で label句や他の関数で見出しを削除するしかありません。
この見出しの対処方法は今回は触れず、他の句の解説の中で解説していきます。
select句の4つの合わせ技を見ていきましょう。
select句合わせ技1. 集計関数で列を集計
まずは集計関数から見ていきましょう。
select句で集計関数が使える

QUERY関数は、基本的にはデータを集計する為の関数なので、 sum や count といった 5つの集計関数が 第2引数のクエリ文で利用できます。
多くの人が集計関数は group by句 とセットで使うイメージを持っているかと思いますが、実は単体で select句だけでも 集計関数は利用可能です。

=QUERY(A:E,"select sum(Col5)")
上の式は 5列目の 売上の列を合計した 16250を算出しています。余計な見出しもついてしまってますが、 =SUM(E:E) の結果と一致しているのがわかりますね。
集計関数の sum は シート関数の SUMと同じ挙動であると言えます。
まぁこんな使い方は普通はしませんが、実は次回登場する超応用例でコレが活用できます。
とりあえず select と 集計関数だけでも使えるってことを覚えておきましょう。
集計関数の countは シート関数だとCOUNT関数ではなく、COUNTA関数に近いものです。

COUNT関数は 範囲内の数値の個数を数える関数で、文字列はカウント対象外となります。
👆の画像では、文字列のC列を対象とした =COUNT(C:C) が0を返しているのがわかりますね。
文字列を含め値の入っているセルの個数を数える関数は COUNTA関数となります。
=COUNTA(C:C) は 23を返しています。
集計関数の countは 数値型の列、文字列型の列、どちらでも使えるので COUNTAに近いといえるでしょう。
=QUERY(A:E,"select count(Col3)")
は先頭行を見出しと判断して除外している為、 =COUNTA(C:C) の23より 一つ少ない 22を返しています。

どちらも空白セルはカウントしないので、👆のように2つセルを空白にすると、どちらも結果が2減っているのがわかります。
集計関数の avg関数はシート関数の AVERAGE関数と同じイメージです。

どちらも空白セルは対象外とた上で データの平均値を返してくれます。
出力結果に差があるのはQUERY関数だと表示形式の自動調整がシート関数と違う為です。小数点以下を四捨五入で表示しているかどうかの違いで、どちらも中身は 同じ数値となっています。
集計関数 max と minは 文字列にも使える
QUERY関数の集計関数である maxとminは、シート関数のMAX、MINと少し挙動が違います。

数値型の列に使った時は一緒です。
余談ですが、集計関数も 列の指定と同じように
=QUERY(A:E,"select max(Col5),min(Col5)")
このようにカンマ区切りで複数記述ができます。
上で select句は同じ列を何度も指定できないと書きましたが、実はこのように max(Col5),min(Col5) と加工の仕方が違えば 同じCol5でも 2回使うことができます。(ここはポイント)

max(Col5),max(Col5) のように 加工方法含め完全に同じだとエラーとなります。
で、数値と同じく 日付や日時も 集計関数の max,min は シート関数と同じ結果を返すんですが、違うのは文字列型の列を指定した時。

シート関数の MAX、MINは 文字列を無視した上で空白を0と見なして、どちらも0を返しています。これはMAXやMINが、テキストを無視した上で空白セルを0と見なして結果を返している為です。
つまりシート関数のMAX,MINは文字列に使うことは出来ません。
一方公式にも記述がある通り、QUERY関数の集計関数の max,minは 文字列をアルファベット順で 見て、A(小) ▶ Z(大) と判断し 文字列の中の最大値、最小値を返します。
この時空白セルは無視されます。

わかりやすい例で利用すると

このようになります。
=QUERY(表_1,"select max(Col1),min(Col1),max(Col2),min(Col2)")
簡単に言えば、昇順で並び替えた時の先頭に来る値を minで取得し、降順で並び替えた時に先頭に来る値を maxで取得できるってことです。
集計関数 max と minは 大文字・小文字、ひらがな・カタカナを厳密に区別する

QUERY関数の集計関数 max,minは、アルファベットの場合は大文字・小文字を区別して判別し、
「大文字の方が小さく、小文字の方が大きい」として扱われます。(紛らわしい)
また、ひらがな・カタカナも同様に区別して判断し、
「ひらがなの方が小さく、カタカナの方が大きい」と扱われます。
面白いですね。
ただ、日本語でも漢字の場合は注意が必要です。

SORT関数の結果と違って、日本人の音読みの並び替えのイメージとはかけ離れた結果になるので注意しましょう。
これは以前少し触れましたが、QUERY関数の並び替え基準が ユニコード値基準である為です。
この部分は order by句の解説の際に、改めて掘り下げたいと思います。
ちなみに max、minは 文字列型だけでなく Boolean(ブール値)にも使えます。

TRUEの方がFALSEよりも大きい扱いなので、文字列として比較してるわけでは無さそう。
まぁ、これが使えるケースは思いつきませんが、QUERY関数の max,minは全ての型に対して使えるってことです。
集計関数は 列識別子以外は使えない
グループ集計、ピボット集計において非常に強力な集計関数ですが、残念ながら 列識別子に対してのみ利用できるものとなっています。

つまり、

この後登場しますが
=QUERY(A1:D12,"select Col4-Col3")
このように列と列を演算子で計算して、上期から下期の増減を算出したり
=QUERY(A1:D12,"select max(Col4)")
下期の売上の最大値を算出したりは可能ですが
=QUERY(A1:D12,"select max(Col4-Col3)") ・・・これは✖
max(Col4-Col3) このように集計関数の引数に Col4-Col3のように列(の識別子)以外のものを入れることは出来ないってことです。
このような計算が必要となる場合はQUERYを入れ子にするなど工夫が必要となります。
【余談】ExcelのGROUPBY関数、PIVOTBY関数との比較
QUERY関数のクエリ文では、集計関数として用意されている
sum
count
avt
max
min
この5つしか使えません。
これ以外の関数、たとえば集計の際 TEXTJOIN関数やINDEX関数などをクエリ文内で使いたいと思っても、それは出来ません。
一方、Excelの最新集計関数 GROUPBY関数や PIVOTBY関数は、関数を指定する引数に SUM や COUNTAなど イータ縮小ラムダを使うことが一般的ですが、LAMBDA関数をかませば 基本的にほぼ全てのシート関数を使うことが可能です。
データベース的に集計をするSQLチックな他のシート関数とは一線を画すGoogleスプレッドシートのQUERY関数と、シート関数の延長線上のExcelのGROUPBY関数、PIVOTBY関数の方向性の違いと思いますが、
やりたい処理によっては QUERY関数では出来ない処理でも、GROUPBYやPIVOTBYでは簡単に出来ることがあるのを覚えておくとよいでしょう。
この比較は別途書きたいと思います。
select句合わせ技2. スカラー関数で列を加工
スカラー関数は、対象の列の型が 日付型や日時、時刻などの時に利用するものがほとんどです。
今回は日付や日時は扱わないので、数少ない文字列型に使えるスカラー関数の

upperとlower だけ触れておきましょう。
大文字に統一 upper、小文字に統一 lower
QUERY関数で使えるスカラー関数の upperとlowerは、アルファベットをupperは大文字、lowerは小文字に揃える関数です。

■1列目のアルファベットを全て大文字に統一
=QUERY(A:A,"select upper(Col1)",1)
■1列目のアルファベットを全て小文字に統一
=QUERY(A:A,"select lower(Col1)",1)
これはシート関数の UPPER関数、LOWER関数と基本的に同じ挙動です。
これは、どちらかと言えば where句で活躍するもので、あまり select句では使いません。
upper、lowerは文字列以外に適用するとエラーとなり、

アルファベット以外の文字(日本語や数値文字列)や空白に適用した場合は文字列に影響(変化)はなく、そのまま出力されます。

select句合わせ技3. 演算子で列を計算

列同士や列と単体の数値といった組み合わせで、クエリ文で算術演算子が使えます。
QUERY関数の第3回でも触れましたが、実は公式から漏れている演算子があって、それが %(modulo)です。
$$
\begin{array}{lll}
\text{No}&\text{演算子}&\text{解説}\\ \hline
\text{1}&\text{+}&\text{加算(足し算)}\\ \hline
\text{2}&\text{-}&\text{減算(引き算)}\\ \hline
\text{3}&\text{*}&\text{乗算(掛け算)}\\ \hline
\text{4}&\text{/}&\text{除算(割り算)}\\ \hline
\text{5}&\text{\%}&\text{剰余 (余り) 類似シート関数 : MOD}\\ \hline
\end{array}
$$
👆というわけで、こちらがQUERY関数の select句で使える算術演算子の完全版となります。(もし他に利用できる演算子があればお知らせください)
QUERY関数は 演算子で 行毎に計算ができる

■加算(足し算)、減算(引き算)
=QUERY(A2:D12,"select Col1+Col2,Col1-Col2")
■乗算(掛け算)、除算(割り算)
=QUERY(A2:D12,"select Col1*Col2,Col1/Col2")
■剰余(あまり)
=QUERY(A2:D12,"select Col1%Col4")
QUERY関数のselect句で演算子を使うと、指定した列同士を 行毎に計算した結果を出力することが出来ます。
演算子を使った場合も、集計関数やスカラー関数を使った時と同じように自動で見出し行が生成されます。
sum(列1列2)
difference(列1列2)
product(列1列2)
quotient(列1列2)
modulo(列1列4)
ここから小学校の算数の話になりますが、演算はカッコを使うことで計算の優先順位を制御もできます。

=QUERY(A2:D12,"select Col1-Col2/Col4")
とした場合は、当然 減算(引く)より先に 除算(割る)を計算するので、Col2/Co4 を計算したものを Col1から引くことで結果は小数点が繰り返す数値となります。
これを
=QUERY(A2:D12,"select (Col1-Col2)/Col4")
とすることで、先に Col1-Col2 を計算し、その結果を Col4で割るという順序で、まったく違う結果(全て3)となっているのがわかりますね。
Q1. QUERY関数の select で演算子を使って シート関数の QUOTIENTと同じ割った時の整数部分のみを取得したい

長くなってきましたが、小学校の算数の話になったんで簡単なお題を1ついってみましょう。
QUERY関数の演算子で割り算をした場合、小数点以下の数値が出てしまいます。
これを割り算した結果の整数部分、つまり シート関数の QUOTIENT関数で1列目を2列目で割った結果(画像右)と同じものをQUERY関数で出力したいというお題です。
データはこちら
列1 列2
8 6
70 9
40 7
90 4
5 30
20 2
80 3
60 8
10 1
50 10どうでしょう、小学校の算数を思い出して考えてみましょう!
↓↓
回答はここから。
↓↓
A1. QUERY関数の select で演算子を使って シート関数の QUOTIENTと同じ割った時の整数部分のみを取得したい
回答です。

=QUERY(A2:B12,"select (Col1-Col1%Col2)/Col2")
ここで隠れ演算子の %(Modulo)とカッコが活躍します。
小学校の割り算を思い出してみると
割られる数 ÷ 割る数 = 商 ・・・ 余り
こんな式になってますよね。これを書き換えると
割られる数 = 割る数 × 商 + 余り
こうなります。この 商の部分が 割った時の整数部分、つまりシート関数で QUOTIENTを使った時の結果なので
商 = ( 割られる数 - 余り ) ÷ 割る数
こう計算すればよいってことです。
QUERY関数内で 割られる数は Col1、割る数はCol2、余りは %で計算できるので、
( Col1 - Col1 % Col2 ) / Col2
となります。
ExcelやGoogleスプレッドシートだったら通常は、ROUNDDOWN関数 や INT関数、TRUNK関数 でサクッとできちゃう小数点以下の切り捨ても、演算子を使うとなかなか面倒。
でも、上記のシート関数が使えないQUERY関数内部の計算でも演算子を駆使すれば QUOTIENT関数と同じ結果を取得出来るってことです!
演算子は 列以外に 直接数値や集計関数の結果を使うことも出来る

QUERY関数内の演算子は列(識別子)だけではなく、直接数値を指定して計算に使うことも出来ます。
=QUERY(A2:D12,"select Col1+1,Col1-5,Col1*3")
このように記述することで、列1の各値に1を足したり、5を引いたり、3をかけたりといったことが可能です。
この数値の直接指定はセル参照を使ったり数式の結果を利用することも可能で、その場合は一度 "ダブルクォートでその手前で文字列を閉じて & で連結させて記述します。

=QUERY(A2:D12,
"select Col1+"&K1&",Col1-"&L1&",Col1*"&MAX(K1:M1))
数式バーで 文字列部分がきちんと緑になっていることを確認しましょう。

また、演算子は 集計関数の結果に対して利用することも可能です。

先ほど書いた通り 集計関数は 列(識別子)しか引数にとれないので
✖ =QUERY(A2:D12,"select sum(Col1*Col2)")
👆これだとエラーになりますが、
◎ =QUERY(A2:D12,"select sum(Col1)*sum(Col2)")
👆これならOKってことです。
【注意】演算子は数値型にしか使えない

集計関数は縦に見て計算するものですが、演算子は横に見て計算する機能です。
その為、列の型が混在してしまうことがあるのですが、注意点として 演算子は 一つでも数値型ではない列が入っていると 全体エラーとなってしまいます。
上の式は 1列目、Col1が文字列型なのでエラーとなっています。

ExcelやGoogleスプレッドシートだと TRUE/FALSEといったブール値や日付は、演算子を使った計算では数値として扱える感覚ですが、QUERY関数のクエリ文では 厳密に数値型とは区別され 演算子が使えません。
一番困るのは 空白(Null)が混在するケースです。

QUERY関数の演算子で 空白を含む数値型の列を 演算子で計算する場合、空白は 0として扱われたり、無視されることはなく、空白を含む行だけ計算結果が 空白となってしまいます。
これは困りますね。。 Null強すぎるだろ!!
集計関数の場合は先ほど記載しましたが、空白は無視して集計してくれます。
このように 空白セルを含むデータを対象として、QUERY関数で列の演算をする場合は、

第1引数の段階で空白を 0埋めする必要があるってことです。
例はN関数を使っていますが、N(A2:C12) だと 見出し行文字が 0に変換されてしまうので、IF(A2:C12="",0,A2:C12) とした方が丁寧ですね。
いずれにせよ 第1引数で配列計算をする時は、ARRAYFORMULA関数を組み合わせる必要があります。
【余談】select句の演算子で 文字列結合が使えたら・・・
QUERY関数は非常に便利なんですが、mirが感じるのは 文字列操作が弱いという点。
この select句の演算子でも、GAS(JavaScript)みたいに 文字列型が混在しても + で連結したら

こんな感じで文字列結合出来たら 超便利なんですが・・・。
残念ながら クエリ文内で文字を連結することは出来ません。
select句合わせ技4. 値指定で列を生成

公式には特に明言されてませんが、QUERY関数のselect句では直接 値を指定することで、第1引数に存在しない列を生成し出力することが出来ます。
先ほど演算子で Col1*5 のように 直接数値を組み合わせることが可能と書きましたが、演算子を使わず直接 5 という数値を指定できるわけです。
この時も自動で見出しが生成されます。値を直接指定した時の独特な挙動を見ていきましょう。
select句で値を指定した時の挙動

select 句で指定した値は 第1引数の行数と同じ行数に拡張されます。
これが面白いのは select句で一つも第1引数の列を選ばなくても、値は第1引数の行数に拡張されるという点。

=QUERY(A2:C12,"select 5,10,20")
たとえば、このように第1引数を選択せずに select 5,10,20 とした場合、5,10,20 が 第1引数のデータの行数分(今回の場合は10行分)繰り返されます。
つまり SEQUENCE関数で10行のダミー配列を生成して第1引数に指定すれば

=QUERY(SEQUENCE(10),"select 1,2,3")
このように簡単に複数の値を下に〇個拡張させるといったことが簡単に出来ます。
数値ではなく文字列をselect句で直接指定することも可能で、

=QUERY(SEQUENCE(10),"select 'とんで','まわって'")
文字列の場合は、' シングルクォートで括る決まりとなっています。

=QUERY(,"select 1,2,3")
select句で直接指定した値は、第1引数の行数分下方向に繰り返されると書きましたが、第1引数が空の場合は Nullが1行存在しているという扱いになり、見出しと1行だけが返ります。
また、列の指定と同様に 値の直接指定の場合も

同じ値を2回以上指定するとエラーとなります。
select句で空白列を生成する

select句では 単体の値を直接指定出来ますが、空白や空文字を指定することが出来ません。
=QUERY(A2:C12,"select Col1,'',Col2")
とした場合は、#N/Aエラーに
=QUERY(A2:C12,"select Col1,,Col2")
だとクエリ文の構文ミスで #VALUE!エラーとなります
回避方法として スペースを入れる方法もありますが

=QUERY(A2:C12,"select Col1,' ',Col2")
これはあくまでも見た目上は空白に見えるだけで、中身はスペースが入ったセルの繰り返しです。ISBLANK関数で判定すると FALSE(空白ではない)となります。
というわけで、mirとしては QUERY関数の select句で空白を入れる方法として

=QUERY(A2:C12,"select Col1,1/0,Col2")
1/0 を使って空白を生成する方法を推奨します。
これはQUERY関数シリーズの前回、select句で evalする方法の解説の中でも紹介しました。
解説4-1 QUERY関数の select句で 空白列を生成する裏技
あくまでも数式が展開されている範囲なので、この空白セルに直接手打ちで値を入れることは出来ませんが、印刷する資料や値コピペして利用する等で空白が必要って時には便利じゃないでしょうか。
次回 QUERY関数の select句 超応用例
今回はQUERY関数の select句の基本、出来ること、出来ないことを 書きました。
次回は今回の内容を踏まえて、select句を数式で生成する方法やselect句を使った裏技など 超応用例に入っていきます。
まさか select句だけでも1回で終わらないとは・・・。
いいなと思ったら応援しよう!
チップ大歓迎です。やる気がアップしますw