今天要來聊聊 SORT 和 UNIQUE,一個負責排序,一個負責把重複的資料去掉。
這兩個函式有個共通的好處:它們都是在別的地方「生出」一份新的結果,原始資料完全不動。原始資料改了,結果也會跟著變。
手動整理有多麻煩
我手上有一張手搖飲的訂單紀錄,一共 10 筆,分成信義和板橋兩間門市:
| A | B | C | |
|---|---|---|---|
| 1 | 品項 | 門市 | 杯數 |
| 2 | 蘋果紅茶 | 信義 | 12 |
| 3 | 烏龍奶茶 | 板橋 | 37 |
| 4 | 蘋果綠茶 | 信義 | 8 |
| 5 | 蘋果紅茶 | 板橋 | 21 |
| 6 | 烏龍奶茶 | 信義 | 5 |
| 7 | 青茶 | 板橋 | 29 |
| 8 | 蘋果綠茶 | 板橋 | 9 |
| 9 | 蘋果紅茶 | 信義 | 12 |
| 10 | 青茶 | 信義 | 17 |
| 11 | 烏龍奶茶 | 板橋 | 37 |
我想做兩件事:把訂單按杯數由多到少排好,還有找出「到底賣過哪幾種飲料」。
排序可以用選單,去重可以手動刪,不過 10 筆還好,如果資料每天都會新增呢?每天重新排一次、重新刪一次,想到就有點累了吧!這時候就可以請 SORT 和 UNIQUE 出場。
SORT
SORT 會把一個範圍照你指定的欄位重新排列,排好的結果放在別處,原本的資料維持原樣。
語法
- 範圍:要排序的資料。
- 排序欄:要依哪一欄排序,填的是這一欄在「範圍」裡面的第幾欄,不是試算表的 A、B、C 欄。排序欄也可以是範圍外的另一個單欄範圍,但列數要和範圍一樣。
- 遞增:
TRUE是由小到大,也就是遞增,FALSE是由大到小,也就是遞減。 - 排序欄2、遞增2:選填,可以一組一組往後加,越前面的優先。
這邊要記得,「遞增」只認 TRUE 和 FALSE。很多人,包括以前的我,會想說用 -1 表示降序,但這是 Excel 的寫法,在 Google 試算表裡 -1 會被當成 TRUE,結果還是升序,而且不會報錯,很容易沒發現。Excel 的 SORT 正好反過來,sort_order 用 1(遞增)和 -1(遞減),降序要寫 ,所以同一條公式在兩邊貼來貼去,這個參數一定要改。
單欄排序
我想把訂單按杯數由小到大排。範圍是 A2:C11,不含標題列,杯數是這個範圍的第 3 欄。
如果要用 SORT 寫,就是:
依杯數由小到大排序
=SORT(A2:C11, 3, TRUE)A2:C11:要排序的資料,整張訂單。3:依第 3 欄,也就是杯數排序。TRUE:遞增。
在 E2 輸入公式,按下 Enter,結果會從 E2 往下、往右展開成 10 列 3 欄。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 信義 | 5 |
| 蘋果綠茶 | 信義 | 8 |
| 蘋果綠茶 | 板橋 | 9 |
| 蘋果紅茶 | 信義 | 12 |
| 蘋果紅茶 | 信義 | 12 |
| 青茶 | 信義 | 17 |
| 蘋果紅茶 | 板橋 | 21 |
| 青茶 | 板橋 | 29 |
| 烏龍奶茶 | 板橋 | 37 |
| 烏龍奶茶 | 板橋 | 37 |
整列都跟著杯數一起移動,品項和門市不會跟杯數對不上。想要由多到少,把最後一個參數換成 FALSE 就好:
依杯數由大到小排序
=SORT(A2:C11, 3, FALSE)結果會是 37、37、29、21、17、12、12、9、8、5,剛好倒過來。
範圍如果連標題列一起框進去,標題也會被當成資料排進去,所以我習慣範圍從第 2 列開始選。
多欄排序
如果兩筆的杯數一樣,或者我想「先按門市分,同一間門市再按杯數排」,就要多寫一組排序欄和遞增。
先依門市遞增,同門市內再依杯數遞減
=SORT(A2:C11, 2, TRUE, 3, FALSE)2, TRUE:第一優先,依第 2 欄,也就是門市,遞增。3, FALSE:第二優先,門市相同的話,依第 3 欄,也就是杯數,遞減。
Google 試算表是「成對」把排序欄和遞增一組一組往後接。Excel 的 SORT 一次只收一個排序欄,多欄排序要改用 SORTBY(也是一組一組成對寫)。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 烏龍奶茶 | 板橋 | 37 |
| 青茶 | 板橋 | 29 |
| 蘋果紅茶 | 板橋 | 21 |
| 蘋果綠茶 | 板橋 | 9 |
| 青茶 | 信義 | 17 |
| 蘋果紅茶 | 信義 | 12 |
| 蘋果紅茶 | 信義 | 12 |
| 蘋果綠茶 | 信義 | 8 |
| 烏龍奶茶 | 信義 | 5 |
咦,板橋怎麼排在信義前面?因為試算表的語言設定是台灣時,中文是照筆畫由少到多排的,「板」8 畫、「信」9 畫,所以板橋在前。不是照注音,也不是照拼音喔!
UNIQUE
UNIQUE 會把重複的列去掉,只留下不重複的部分,順序是它們在來源範圍中第一次出現的順序。
語法
- 範圍:要找不重複值的資料。
- 依欄比對:選填,預設是
FALSE,也就是一列一列比較。填TRUE的話,會改成一欄一欄比較。 - 只留出現一次的:選填,預設是
FALSE。填TRUE的話,只會留下「完全沒有重複」的項目,只要有重複,連第一筆也不留。
範例
我想知道賣過哪幾種飲料,只看品項那一欄:
列出不重複的品項
=UNIQUE(A2:A11)結果是蘋果紅茶、烏龍奶茶、蘋果綠茶、青茶,4 種。順序就是它們在 A 欄第一次出現的順序。
範圍也可以是多欄。這時候 UNIQUE 比對的是整列,三欄都一樣才算重複:
去掉完全相同的整列訂單
=UNIQUE(A2:C11)原本 10 筆,「蘋果紅茶、信義、12」和「烏龍奶茶、板橋、37」各出現兩次,所以會剩下 8 列:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 蘋果紅茶 | 信義 | 12 |
| 烏龍奶茶 | 板橋 | 37 |
| 蘋果綠茶 | 信義 | 8 |
| 蘋果紅茶 | 板橋 | 21 |
| 烏龍奶茶 | 信義 | 5 |
| 青茶 | 板橋 | 29 |
| 蘋果綠茶 | 板橋 | 9 |
| 青茶 | 信義 | 17 |
只留出現一次的整列
第三個參數填 TRUE,會把有重複的列整組拿掉,連第一筆都不留。第二個參數用不到,維持預設的 FALSE 就好:
只留下完全沒有重複的整列訂單
=UNIQUE(A2:C11, FALSE, TRUE)剛剛重複的那兩筆訂單,兩份都消失了,剩下 6 列:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 蘋果綠茶 | 信義 | 8 |
| 蘋果紅茶 | 板橋 | 21 |
| 烏龍奶茶 | 信義 | 5 |
| 青茶 | 板橋 | 29 |
| 蘋果綠茶 | 板橋 | 9 |
| 青茶 | 信義 | 17 |
和上一個對照一下,差別就在「重複的那一組要留一筆,還是全部不要」。
依欄比對
資料如果是橫著放的,就輪到第二個參數上場。假設 A1:F1 這一列放的是六筆訂單的門市:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 信義 | 板橋 | 信義 | 中和 | 板橋 | 信義 |
橫向資料依欄去除重複
=UNIQUE(A1:F1, TRUE)結果會橫向展開,只剩下「信義」「板橋」「中和」三欄。要是這邊沒填 TRUE,UNIQUE 會把這一整列當成一列,只有一列當然就沒東西可以去重,原樣回傳。
SORT 搭配 UNIQUE
兩個函式可以套在一起:先用 UNIQUE 去重,再把結果交給 SORT 排序。
回到一開始的題目,我想要「不重複的訂單,杯數由多到少」:
先去除重複的訂單,再依杯數由大到小排序
=SORT(UNIQUE(A2:C11), 3, FALSE)從最裡面的括號看起:UNIQUE(A2:C11) 先得到上面那 8 列,SORT 再把這 8 列按第 3 欄遞減排好。來看看結果:
| 品項 | 門市 | 杯數 |
|---|---|---|
| 烏龍奶茶 | 板橋 | 37 |
| 青茶 | 板橋 | 29 |
| 蘋果紅茶 | 板橋 | 21 |
| 青茶 | 信義 | 17 |
| 蘋果紅茶 | 信義 | 12 |
| 蘋果綠茶 | 板橋 | 9 |
| 蘋果綠茶 | 信義 | 8 |
| 烏龍奶茶 | 信義 | 5 |
只想要品項的清單的話,也是同樣的套法:
不重複的品項,依品項遞增排序
=SORT(UNIQUE(A2:A11), 1, TRUE)單欄的資料,排序欄就是 1。結果依序是青茶、烏龍奶茶、蘋果紅茶、蘋果綠茶,一樣是照筆畫:「青」8 畫、「烏」10 畫、「蘋」20 畫,兩個「蘋果」開頭的再比下一個字,「紅」比「綠」少畫。
結果出現 #REF! 怎麼辦?
SORT 和 UNIQUE 的結果都會自己往下、往右展開,這叫溢出。如果展開的路上有別的資料擋住,整個公式就會出現 #REF!。
舉例來說,我在 E2 輸入 ,它需要 E2 到 E5 這 4 格。但如果 E4 已經有東西,比如我隨手打了一個「x」,E2 就會變成 #REF!。
滑鼠移到 E2 的錯誤提示上,會看到「系統未展開陣列結果,以免覆蓋 E4 中的資料。」。把 E4 的內容清掉,結果就會自己跑出來,不用重新輸入公式。
所以我習慣把這類公式放在一塊空的區域,或是獨立的工作表,下面和右邊都不放其他東西。
我自己怎麼選
我個人的習慣是這樣:
- 一次性的整理,例如把這份訂單排好就交給同事,我會直接用選單的「資料」>「排序範圍」,比寫公式快。
- 要給別人隨時開來看的報表頁,我會用
SORT,因為原始資料新增後,報表頁會自己更新排序。 - 只是自己想暫時換個角度看資料,我會用「篩選器」,排完就可以還原,不會留下東西。
要注意,選單排序和篩選器是直接動到原本的資料或檢視,SORT 則完全不動來源。
練習
只留一次出現的訂單,再按杯數由大到小
用 A2:C11 的訂單,只留下沒有重複的整列訂單,有重複的兩筆都不要,再依杯數由大到小排序。要怎麼寫?
試著用用看吧!如果想先篩出一部分資料再排序,可以接著看 FILTER,跟 SORT 搭配起來很順手。
拿 SORT 和 UNIQUE 組出會員排行榜的寫法在 SORT 與 UNIQUE 實戰,結果看起來怪怪的時候,可以翻 SORT、UNIQUE、SORTN 進階陷阱。
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
這篇在技能樹的 Lv.2「進階分析」,模組「篩選與整理資料」(第 2/2 篇)。讀完這篇,路線上的下一個模組是「整理文字資料」。
回到技能樹相關文章
查看所有文章留言討論
共 0 則留言
