這篇是 QUERY 的第一篇教學。QUERY 可以用一小段像 SQL 的文字,一次完成「只留這幾欄、只要符合條件的列、再排好順序」。
先看看這張飲料店的訂單表,一共 12 筆,放在 A1:E13:
| 日期 | 品項 | 杯數 | 金額 | 通路 |
|---|---|---|---|---|
| 2026/03/03 | 蘋果紅茶 | 12 | 540 | 店內 |
| 2026/03/05 | 青茶 | 7 | 245 | 外送 |
| 2026/03/09 | 蘋果紅茶 | 5 | 235 | 外送 |
| 2026/03/14 | 烏龍奶茶 | 9 | 441 | 店內 |
| 2026/03/21 | 青茶 | 14 | 476 | 店內 |
| 2026/04/02 | 蘋果紅茶 | 8 | 376 | 店內 |
| 2026/04/06 | 烏龍奶茶 | 6 | 306 | 外送 |
| 2026/04/11 | 青茶 | 11 | 396 | 店內 |
| 2026/04/18 | 蘋果紅茶 | 13 | 598 | 外送 |
| 2026/04/27 | 烏龍奶茶 | 4 | 204 | 店內 |
| 2026/05/04 | 青茶 | 10 | 360 | 外送 |
| 2026/05/16 | 蘋果紅茶 | 7 | 329 | 店內 |
我想找「一次買 10 杯以上的訂單」,只看日期、品項、杯數三欄。用眼睛掃的話,要一列一列看杯數,再把三欄手動抄出來。12 列還撐得住,換成 1,200 列就不太想做了,這時候可以把 QUERY 派上場。
QUERY
QUERY 會對一個範圍下一段查詢語句,把符合的結果整理成一張新表。
語法
- 資料:要查詢的範圍,例如
A1:E13。 - 查詢:用雙引號包起來的查詢語句,也可以放在別的儲存格再參照。
- 標題列數(選填):資料最上面有幾列是標題。不填的話,試算表會自己從內容猜。
查詢語句用的是 Google Visualization API Query Language,語法跟 SQL 很像,但沒學過 SQL 也完全沒問題。一句查詢是由好幾個子句照固定順序接起來的:select、where、group by、pivot、order by、limit、offset、label、format。每個都可以省略,這篇先講最常用的四個。順序寫反會出錯,所以先記一下:select 在最前面,where 在後面,接著才是 order by、limit。
select:挑要顯示的欄位
我想先只看品項和杯數兩欄,如果要用 QUERY 寫,就是:
只取品項和杯數兩欄
=QUERY(A1:E13, "select B, C")這邊的 B、C 是「欄位代號」,用的是工作表上實際的欄字母。我的資料從 A 欄開始,所以 B 就是品項、C 就是杯數。來看看結果(共 13 列,第一列是 QUERY 帶出來的標題):
| 品項 | 杯數 |
|---|---|
| 蘋果紅茶 | 12 |
| 青茶 | 7 |
| 蘋果紅茶 | 5 |
| 烏龍奶茶 | 9 |
| 青茶 | 14 |
| 蘋果紅茶 | 8 |
| 烏龍奶茶 | 6 |
| 青茶 | 11 |
| 蘋果紅茶 | 13 |
| 烏龍奶茶 | 4 |
| 青茶 | 10 |
| 蘋果紅茶 | 7 |
要全部欄位的話寫 select *。欄位順序可以自己換,select C, B 就會先顯示杯數、再顯示品項。
where:設條件
回到一開始的題目,「一次買 10 杯以上」就是在 select 後面加 where:
杯數大於等於 10 的訂單,顯示日期、品項、杯數
=QUERY(A1:E13, "select A, B, C where C >= 10")來看看結果:
| 日期 | 品項 | 杯數 |
|---|---|---|
| 2026/03/03 | 蘋果紅茶 | 12 |
| 2026/03/21 | 青茶 | 14 |
| 2026/04/11 | 青茶 | 11 |
| 2026/04/18 | 蘋果紅茶 | 13 |
| 2026/05/04 | 青茶 | 10 |
一共 5 筆。數字條件直接寫數字,不用引號。可以用的比較符號有 =、!=(或 <>)、>、<、>=、<=,條件之間可以用 and、or 連接。
文字條件的引號
如果條件是文字,要用引號把文字包起來。因為整個查詢已經被雙引號包住了,裡面的文字就改用單引號:
品項是青茶的訂單,顯示日期和杯數
=QUERY(A1:E13, "select A, C where B = '青茶'")| 日期 | 杯數 |
|---|---|
| 2026/03/05 | 7 |
| 2026/03/21 | 14 |
| 2026/04/11 | 11 |
| 2026/05/04 | 10 |
這是新手很容易卡住的地方,如果寫成 B = "青茶",雙引號會把查詢字串提早結束,公式就壞掉了。官方文件說單引號和雙引號都可以當字串引號,所以在公式裡一律用單引號最保險。
日期條件
日期不能直接寫 2026/04/01,要用 date 加上 yyyy-mm-dd 格式的文字:
只看 2026 年 4 月的訂單
=QUERY(
A1:E13,
"select A, B, C where A >= date '2026-04-01' and A < date '2026-05-01'"
)| 日期 | 品項 | 杯數 |
|---|---|---|
| 2026/04/02 | 蘋果紅茶 | 8 |
| 2026/04/06 | 烏龍奶茶 | 6 |
| 2026/04/11 | 青茶 | 11 |
| 2026/04/18 | 蘋果紅茶 | 13 |
| 2026/04/27 | 烏龍奶茶 | 4 |
日期還有幾個容易踩的坑,整理在 QUERY 進階陷阱。
order by:排序
order by 後面接要排序的欄位,預設由小到大,加 desc 就是由大到小。我想看青茶的訂單,杯數多的排前面:
青茶的訂單,依杯數由大到小
=QUERY(A1:E13, "select A, C where B = '青茶' order by C desc")| 日期 | 杯數 |
|---|---|
| 2026/03/21 | 14 |
| 2026/04/11 | 11 |
| 2026/05/04 | 10 |
| 2026/03/05 | 7 |
要小心 order by 的位置,它得放在 where 的後面。
如果排序的欄位是中文,QUERY 的 order by 是照字碼(Unicode)的順序排,不是筆畫、注音或拼音:「烏」的字碼最小、「蘋」次之、「青」最大,所以會是「烏龍奶茶」、「蘋果紅茶」、「青茶」。要筆畫排序可以改用 SORT,試算表地區設為台灣時,它排出來是「青茶」、「烏龍奶茶」、「蘋果紅茶」。想要照自己的順序排的話,可以另外加一欄編號。
limit:只取前幾筆
limit 放在最後,指定最多回傳幾列。想知道金額最高的 3 筆訂單:
金額最高的三筆訂單
=QUERY(A1:E13, "select A, B, D order by D desc limit 3")| 日期 | 品項 | 金額 |
|---|---|---|
| 2026/04/18 | 蘋果紅茶 | 598 |
| 2026/03/03 | 蘋果紅茶 | 540 |
| 2026/03/21 | 青茶 | 476 |
四個子句合起來就是:先 select 挑欄位,where 篩列,order by 排序,最後 limit 截尾。
offset:排序後跳過前幾筆,再取一頁
用一張小表示範 offset,也可以參考方格子的 ORDER BY/LIMIT/OFFSET 舊文。另開空白表,在 A1:B4 放代碼/杯數兩欄,資料依序是 B/20、A/10、C/30。D2 輸入:
先按代碼排序,跳過第一筆後取一筆,無來源表頭
=QUERY(
{A2:B4},
"select Col1,Col2 order by Col1 limit 1 offset 1",
0
)排序後是 A/10、B/20、C/30;offset 1 跳過 A/10,limit 1 留一筆,結果是 B/20。語法寫 limit 再 offset,但含義是先跳過、再限制筆數,官方語言文件也這樣定義。這裡的 offset 是查詢子句,不是動態參照用的 OFFSET 函式。
本例範圍從第 2 列開始、表頭參數為 0;若來源含一列表頭,就應明填 1。跳過筆數針對資料列,不拿來源標題當第一筆。分頁必須先訂穩定排序,有同值時再加唯一代碼等排序鍵;不能把目前儲存格位置當成不變的順序。
例如第 5 列新增 AA/15,並把本例範圍擴成 A2:B5,同樣跳過一筆後會回 AA/15,原本的 B 被擠到後面。固定 offset 的頁面會隨新增/刪除資料漂移,不適合拿來當永久資料編號或交付快照;要交付某一次結果,另存當時的篩選與排序條件。
欄位代號:A、B 還是 Col1?
前面用的 A、B 是工作表的欄字母,不是「範圍裡的第幾欄」。範圍如果是 B1:E13,能用的欄位代號就是 B、C、D、E,寫 select A 會得到 #VALUE!,提示是「無法剖析 函式 QUERY 的第 2 參數 的查詢字串:NO_COLUMN: A」。金額在 D 欄,所以這樣寫:
資料範圍從 B 欄開始,查詢內仍然用工作表的字母,D 欄是金額
=QUERY(B1:E13, "select D where D >= 500")| 金額 |
|---|
| 540 |
| 598 |
資料如果不是一個普通的範圍,而是用 { } 自己組出來的陣列(或是其他函式算出來的結果),就沒有「欄位字母」可以對應了,這時要改用 Col1、Col2、Col3 的寫法,意思是陣列的第 1、2、3 欄:
陣列 B1:D13 的第 2 欄是杯數、第 3 欄是金額
=QUERY({B1:D13}, "select Col1, Col3 where Col2 >= 12", 1)| 品項 | 金額 |
|---|---|
| 蘋果紅茶 | 540 |
| 青茶 | 476 |
| 蘋果紅茶 | 598 |
這邊的大括號 { } 在 Sheets 是「自己組一個陣列」的意思。最後的 1 是下一節要講的標題列數。
標題列參數
QUERY 的第三個參數是「資料最上面有幾列是標題」,不填的話會讓試算表自己猜。如果資料的標題是一般文字、下面是數字,它多半猜得對。不過一旦資料第一列也是文字,或是你用 { } 組出來的陣列,猜錯的機會就變高了,所以建議直接寫清楚。
如果範圍不包含標題列,就填 0:
範圍從第 2 列開始,沒有標題,所以標題列數填 0
=QUERY(A2:E13, "select B, C where C >= 13", 0)結果只有兩列資料:青茶 14、蘋果紅茶 13。因為這次沒有標題,所以結果也沒有標題列。(帶彙總函數的查詢另當別論,見 QUERY 進階陷阱。)
練習
外送大單
用 A1:E13 的訂單,找出「通路是外送、金額超過 300」的訂單,顯示日期、品項、金額,金額由大到小排序。
結果會是三列:2026/04/18 蘋果紅茶 598、2026/05/04 青茶 360、2026/04/06 烏龍奶茶 306。
學會這四個子句,已經可以應付大部分「篩選加排序」的需求了。接下來可以看看 QUERY 的分組彙總與月報實戰,那篇用 group by 做加總和平均。如果只是單純篩選,FILTER 的語法會短一點。
如果 QUERY 沒報錯卻少了幾列,或是日期、括號怎麼寫都不對,可以看 QUERY 少了幾列、日期比不出來、括號算錯的原因與修法。
這個步驟如果每週都要重做
- 現在
- 每週手動改條件挑出大單,再複製貼到信裡寄給同事
- 自動化後
- 每週一自動挑出一次買 10 杯以上的訂單,寄給負責的同事
接下來可以
相關文章
查看所有文章用 QUERY 做分組彙總與月報:group by、pivot、label、format
用一張訂單表,一步步用 QUERY 的 group by 算品項加總、筆數、平均,用 pivot 做交叉表,用 label 和 format 整理欄位標題與數字格式,最後組成一份會自動更新的月報。
FILTER 入門:用一個條件篩出你要的資料
FILTER 的語法、單一條件怎麼寫、兩個條件的 AND 與 OR,以及沒有符合資料時的 #N/A。原始資料不動,結果放在別處。
SORT 與 UNIQUE:自動排序、自動去除重複
用 SORT 依一欄或多欄排序,用 UNIQUE 去掉重複的列,再把兩個函式套在一起,做出一份會跟著原始資料自動更新的清單。
留言討論
共 0 則留言
