DSUM、DAVERAGE、DGET 這一排開頭是 D 的函式,是「資料庫函式」,做的事情是先用一塊「條件區」把資料表篩過一遍,再對指定的欄位加總、平均或取值。
坦白說,我在工作上幾乎沒用過這組,因為 SUMIFS、FILTER、QUERY 在 Google 試算表裡更直覺。會遇到它們,多半是接手別人從舊檔案搬過來的試算表,或是想看懂一份用了 DSUM 的檔案。這篇當作工具書,先講共通的條件區寫法,再一個一個查。
怎麼選
12 個函式的語法完全一樣,差別只在最後算什麼。右邊是我平常會改用的寫法:
| 函式 | 算什麼 | 一般寫法 |
|---|---|---|
DSUM | 加總 | SUMIFS |
DAVERAGE | 平均 | AVERAGEIFS |
DCOUNT | 數值的個數 | COUNTIFS |
DCOUNTA | 非空白的個數 | COUNTIFS |
DGET | 取出唯一的一個值 | FILTER、INDEX 搭配 MATCH |
DMAX、DMIN | 最大、最小 | MAXIFS、MINIFS |
DPRODUCT | 連乘 | PRODUCT 搭配 FILTER |
DSTDEV、DSTDEVP、DVAR、DVARP | 樣本與母體的標準差、變異數 | STDEV 等搭配 FILTER |
COUNTIFS 數的是符合條件的列數,不看計算欄是數字還是非空白,所以 DCOUNT、DCOUNTA 對應的 COUNTIFS 只是近似寫法;要完全等價,得再加上計算欄是數字或非空白的條件。
語法與條件區
所有 D 函式都長這樣:
- 資料庫:整張資料表,要包含標題列。
- 欄位:要計算的那一欄。可以寫標題文字(用雙引號包起來,例如
"杯數"),也可以寫這一欄在資料庫裡的第幾欄(從 1 算起)。 - 條件區:另外一塊小範圍,第一列是標題,必須跟資料庫的標題一字不差,標題底下才是條件。
這篇的資料是一張小小的茶飲銷售表,放在 A1:D8:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 品項 | 門市 | 杯數 | 金額 |
| 2 | 蘋果紅茶 | 信義 | 12 | 720 |
| 3 | 青茶 | 信義 | 7 | 315 |
| 4 | 蘋果紅茶 | 板橋 | 5 | 300 |
| 5 | 烏龍 | 板橋 | 9 | 450 |
| 6 | 青茶 | 板橋 | 14 | 630 |
| 7 | 蘋果紅茶 | 信義 | 8 | 480 |
| 8 | 烏龍 | 信義 | 3 | 150 |
條件區的規則只有兩條:
- 同一列的條件是 AND,要全部符合。
- 不同列的條件是 OR,符合其中一列就算。
我想算「蘋果紅茶在信義」的杯數。手動的話,就是找出 A 欄是蘋果紅茶、B 欄是信義的列,也就是第 2 列跟第 7 列,12 + 8 = 20。換成條件區,在 F1:G2 這樣放:
| F | G | |
|---|---|---|
| 1 | 品項 | 門市 |
| 2 | 蘋果紅茶 | 信義 |
標題在第 1 列,條件在第 2 列,同一列所以是 AND。如果想要的是「蘋果紅茶,或是板橋的青茶」,條件就拆成兩列,F1:G3:
| F | G | |
|---|---|---|
| 1 | 品項 | 門市 |
| 2 | 蘋果紅茶 | 信義 |
| 3 | 青茶 | 板橋 |
這邊的意思是「蘋果紅茶且信義」或「青茶且板橋」,第 2、7、6 列符合。只放一個條件欄的話,不同列就是同一欄的 OR,例如 F1 是「品項」,F2 是蘋果紅茶,F3 是青茶,就是這兩種品項都算。
條件也可以寫比較運算子,例如在標題「杯數」下放 >=9。
條件區要記得:
- 標題要和資料庫一模一樣,多一個空格就不會比對到。
- 不要在條件區底下多留空白列。空白的一列會被當成「什麼條件都沒有」,結果變成全部符合。
- 條件裡寫的文字是「開頭符合」:條件寫「蘋果」,「蘋果紅茶」也會被比對到,這點和
SUMIFS的完全比對不同。 - 條件區放在資料庫旁邊的空白處,之後資料增加時,資料庫範圍要記得跟著拉長。
DSUM
對符合條件的列,加總指定欄位。
語法:
蘋果紅茶在信義的杯數總和
=DSUM(A1:D8, "杯數", F1:G2)先手算:12 + 8 = 20,函式也會給你 20。欄位換成第幾欄也一樣, 同樣是 20,因為杯數是資料庫的第 3 欄。
條件區換成上面的兩列版本(F1:G3),會是 12 + 8 + 14 = 34:
蘋果紅茶在信義,或青茶在板橋
=DSUM(A1:D8, "杯數", F1:G3)DAVERAGE
對符合條件的列,計算指定欄位的平均。
語法:
蘋果紅茶在信義的平均杯數
=DAVERAGE(A1:D8, "杯數", F1:G2)(12 + 8) ÷ 2 = 10,結果是 10。
DCOUNT
計算符合條件的列中,指定欄位是數字的個數。
語法:
蘋果紅茶在信義的杯數有幾筆數字
=DCOUNT(A1:D8, "杯數", F1:G2)結果是 2。欄位如果是文字欄,數字個數就是 0,例如 會得到 0,要算文字欄請看下一個。
DCOUNTA
計算符合條件的列中,指定欄位不是空白的個數,文字也算。
語法:
蘋果紅茶在信義的門市欄有幾筆資料
=DCOUNTA(A1:D8, "門市", F1:G2)結果是 2。DCOUNT 和 DCOUNTA 的差別,跟一般的 COUNT 與 COUNTA 一樣:前者只算數字,後者連文字都算。
DGET
取出符合條件的那一個值。
語法:
這個函式要求條件只能剛好符合一列。我想查「信義的烏龍賣了幾杯」,把 F2:G2 改成「烏龍」「信義」,條件區還是 F1:G2:
信義的烏龍杯數
=DGET(A1:D8, "杯數", F1:G2)結果是 3。符合兩列時是 #NUM!,沒有符合列時是 #VALUE!。
DMAX
符合條件的列中,指定欄位的最大值。
語法:
把 F2 改成「青茶」,條件區只取品項那一欄 F1:F2:
青茶單筆最高的杯數
=DMAX(A1:D8, "杯數", F1:F2)青茶有 7 跟 14 兩筆,結果是 14。
DMIN
符合條件的列中,指定欄位的最小值。
語法:
青茶單筆最低的杯數
=DMIN(A1:D8, "杯數", F1:F2)結果是 7。
DPRODUCT
符合條件的列中,指定欄位全部相乘。
語法:
先把 F1:G2 還原為第一列「品項/門市」、第二列「蘋果紅茶/信義」。前節已把 F2 改成青茶,若不還原,以下條件就不會是蘋果紅茶。
蘋果紅茶在信義的杯數連乘
=DPRODUCT(A1:D8, "杯數", F1:G2)12 × 8 = 96。我想不太到杯數連乘有什麼實際用途,單純示範語法,真要連乘的情境多半是成長率之類的欄位。
DSTDEV
符合條件的列中,指定欄位的樣本標準差,分母是 n - 1。
語法:
再把 F2 改回「青茶」,並維持 F1 是「品項」。以下四個標準差與變異數範例都只使用 F1:F2,不讀 G2 的門市條件。
用青茶的 7 跟 14 來算,平均是 10.5,每筆跟平均差 3.5,平方和是 12.25 + 12.25 = 24.5,除以 n - 1 = 1 得到 24.5,開根號約 4.9497:
青茶杯數的樣本標準差,四捨五入到 4 位
=ROUND(DSTDEV(A1:D8, "杯數", F1:F2), 4)結果是 4.9497。
DSTDEVP
符合條件的列中,指定欄位的母體標準差,分母是 n。
語法:
同樣用青茶,24.5 除以 n = 2 是 12.25,開根號剛好是 3.5:
青茶杯數的母體標準差
=DSTDEVP(A1:D8, "杯數", F1:F2)結果是 3.5。樣本與母體的選擇跟一般的 STDEV、STDEV.P 一樣,手上的資料只是抽樣就用樣本,已經是全部就用母體。
DVAR
符合條件的列中,指定欄位的樣本變異數,也就是 DSTDEV 還沒開根號的值。
語法:
青茶杯數的樣本變異數
=DVAR(A1:D8, "杯數", F1:F2)結果是 24.5。
DVARP
符合條件的列中,指定欄位的母體變異數。
語法:
青茶杯數的母體變異數
=DVARP(A1:D8, "杯數", F1:F2)結果是 12.25。
改用 SUMIFS、FILTER 或 QUERY
回到一開始的題目,蘋果紅茶在信義的杯數,一般寫法是:
SUMIFS 版本
=SUMIFS(C2:C8, A2:A8, "蘋果紅茶", B2:B8, "信義")結果同樣是 20。條件直接寫在公式裡,不用另外開一塊條件區,也不用管標題要不要一模一樣,多條件的細節在 SUMIFS 多條件加總 有講。
如果之後還想看明細,或是接著算別的,FILTER 先篩出來再加總更有彈性:
FILTER 搭配 SUM
=SUM(FILTER(C2:C8, A2:A8="蘋果紅茶", B2:B8="信義"))篩選、排序、加總想一次寫完的話,用 QUERY:
QUERY 版本
=QUERY(
A1:D8,
"select sum(C) where A='蘋果紅茶' and B='信義' label sum(C) ''",
1
)這兩種分別在 FILTER 函式 和 QUERY 基礎 有完整教學。
我自己會留著 D 函式的情境只有兩個:檔案本來就是用它寫的,不想改;或是想讓不會寫公式的同事,直接改條件區的儲存格就能換篩選。除此之外,我都用上面的寫法。
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章SUMIFS 進階陷阱:多條件、日期區間、萬用字元與 MAXIFS
整理 SUMIFS、COUNTIFS 多條件加總常踩的坑:參數順序和 SUMIF 相反、範圍大小不一致、日期區間與文字日期、OR 條件重複計算、萬用字元與 ~ 跳脫、空白條件,以及 MAXIFS、MINIFS、AVERAGEIFS 與 COUNTUNIQUEIFS。
FILTER 入門:用一個條件篩出你要的資料
FILTER 的語法、單一條件怎麼寫、兩個條件的 AND 與 OR,以及沒有符合資料時的 #N/A。原始資料不動,結果放在別處。
QUERY 基礎:select、where、order by、limit 四句就能查資料
從一張訂單表開始,學 QUERY 的查詢語言:select 選欄位、where 設條件、order by 排序、limit 取前幾筆,以及欄位代號 A、B 與 Col1 的差別、文字條件的引號和 headers 參數。
留言討論
共 0 則留言
