跳到主要內容跳到頁尾

資料庫函式 DSUM、DAVERAGE、DCOUNT、DGET 全整理:用條件區篩選再計算

8 分鐘閱讀Lv.3 中級摘要與日期

DSUM、DAVERAGE、DCOUNT、DCOUNTA、DGET、DMAX、DMIN、DPRODUCT、DSTDEV、DSTDEVP、DVAR、DVARP 共 12 個資料庫函式的語法與範例,說明條件區同列 AND、不同列 OR 的寫法,以及何時改用 SUMIFS、FILTER 或 QUERY。

發布 更新

文章目錄

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:

ABCD
1品項門市杯數金額
2蘋果紅茶信義12720
3青茶信義7315
4蘋果紅茶板橋5300
5烏龍板橋9450
6青茶板橋14630
7蘋果紅茶信義8480
8烏龍信義3150

條件區的規則只有兩條:

  • 同一列的條件是 AND,要全部符合。
  • 不同列的條件是 OR,符合其中一列就算。

我想算「蘋果紅茶在信義」的杯數。手動的話,就是找出 A 欄是蘋果紅茶、B 欄是信義的列,也就是第 2 列跟第 7 列,12 + 8 = 20。換成條件區,在 F1:G2 這樣放:

FG
1品項門市
2蘋果紅茶信義

標題在第 1 列,條件在第 2 列,同一列所以是 AND。如果想要的是「蘋果紅茶,或是板橋的青茶」,條件就拆成兩列,F1:G3:

FG
1品項門市
2蘋果紅茶信義
3青茶板橋

這邊的意思是「蘋果紅茶且信義」或「青茶且板橋」,第 2、7、6 列符合。只放一個條件欄的話,不同列就是同一欄的 OR,例如 F1 是「品項」,F2 是蘋果紅茶,F3 是青茶,就是這兩種品項都算。

條件也可以寫比較運算子,例如在標題「杯數」下放 >=9。

條件區要記得:

  • 標題要和資料庫一模一樣,多一個空格就不會比對到。
  • 不要在條件區底下多留空白列。空白的一列會被當成「什麼條件都沒有」,結果變成全部符合。
  • 條件裡寫的文字是「開頭符合」:條件寫「蘋果」,「蘋果紅茶」也會被比對到,這點和 SUMIFS 的完全比對不同。
  • 條件區放在資料庫旁邊的空白處,之後資料增加時,資料庫範圍要記得跟著拉長。

DSUM

對符合條件的列,加總指定欄位。

語法:

Google 試算表公式
fx

蘋果紅茶在信義的杯數總和

=DSUM(A1:D8, "杯數", F1:G2)

先手算:12 + 8 = 20,函式也會給你 20。欄位換成第幾欄也一樣, 同樣是 20,因為杯數是資料庫的第 3 欄。

條件區換成上面的兩列版本(F1:G3),會是 12 + 8 + 14 = 34:

Google 試算表公式
fx

蘋果紅茶在信義,或青茶在板橋

=DSUM(A1:D8, "杯數", F1:G3)

DAVERAGE

對符合條件的列,計算指定欄位的平均。

語法:

Google 試算表公式
fx

蘋果紅茶在信義的平均杯數

=DAVERAGE(A1:D8, "杯數", F1:G2)

(12 + 8) ÷ 2 = 10,結果是 10。

DCOUNT

計算符合條件的列中,指定欄位是數字的個數。

語法:

Google 試算表公式
fx

蘋果紅茶在信義的杯數有幾筆數字

=DCOUNT(A1:D8, "杯數", F1:G2)

結果是 2。欄位如果是文字欄,數字個數就是 0,例如 會得到 0,要算文字欄請看下一個。

DCOUNTA

計算符合條件的列中,指定欄位不是空白的個數,文字也算。

語法:

Google 試算表公式
fx

蘋果紅茶在信義的門市欄有幾筆資料

=DCOUNTA(A1:D8, "門市", F1:G2)

結果是 2。DCOUNT 和 DCOUNTA 的差別,跟一般的 COUNT 與 COUNTA 一樣:前者只算數字,後者連文字都算。

DGET

取出符合條件的那一個值。

語法:

這個函式要求條件只能剛好符合一列。我想查「信義的烏龍賣了幾杯」,把 F2:G2 改成「烏龍」「信義」,條件區還是 F1:G2:

Google 試算表公式
fx

信義的烏龍杯數

=DGET(A1:D8, "杯數", F1:G2)

結果是 3。符合兩列時是 #NUM!,沒有符合列時是 #VALUE!。

DMAX

符合條件的列中,指定欄位的最大值。

語法:

把 F2 改成「青茶」,條件區只取品項那一欄 F1:F2:

Google 試算表公式
fx

青茶單筆最高的杯數

=DMAX(A1:D8, "杯數", F1:F2)

青茶有 7 跟 14 兩筆,結果是 14。

DMIN

符合條件的列中,指定欄位的最小值。

語法:

Google 試算表公式
fx

青茶單筆最低的杯數

=DMIN(A1:D8, "杯數", F1:F2)

結果是 7。

DPRODUCT

符合條件的列中,指定欄位全部相乘。

語法:

先把 F1:G2 還原為第一列「品項/門市」、第二列「蘋果紅茶/信義」。前節已把 F2 改成青茶,若不還原,以下條件就不會是蘋果紅茶。

Google 試算表公式
fx

蘋果紅茶在信義的杯數連乘

=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:

Google 試算表公式
fx

青茶杯數的樣本標準差,四捨五入到 4 位

=ROUND(DSTDEV(A1:D8, "杯數", F1:F2), 4)

結果是 4.9497。

DSTDEVP

符合條件的列中,指定欄位的母體標準差,分母是 n。

語法:

同樣用青茶,24.5 除以 n = 2 是 12.25,開根號剛好是 3.5:

Google 試算表公式
fx

青茶杯數的母體標準差

=DSTDEVP(A1:D8, "杯數", F1:F2)

結果是 3.5。樣本與母體的選擇跟一般的 STDEV、STDEV.P 一樣,手上的資料只是抽樣就用樣本,已經是全部就用母體。

DVAR

符合條件的列中,指定欄位的樣本變異數,也就是 DSTDEV 還沒開根號的值。

語法:

Google 試算表公式
fx

青茶杯數的樣本變異數

=DVAR(A1:D8, "杯數", F1:F2)

結果是 24.5。

DVARP

符合條件的列中,指定欄位的母體變異數。

語法:

Google 試算表公式
fx

青茶杯數的母體變異數

=DVARP(A1:D8, "杯數", F1:F2)

結果是 12.25。

改用 SUMIFS、FILTER 或 QUERY

回到一開始的題目,蘋果紅茶在信義的杯數,一般寫法是:

Google 試算表公式
fx

SUMIFS 版本

=SUMIFS(C2:C8, A2:A8, "蘋果紅茶", B2:B8, "信義")

結果同樣是 20。條件直接寫在公式裡,不用另外開一塊條件區,也不用管標題要不要一模一樣,多條件的細節在 SUMIFS 多條件加總 有講。

如果之後還想看明細,或是接著算別的,FILTER 先篩出來再加總更有彈性:

Google 試算表公式
fx

FILTER 搭配 SUM

=SUM(FILTER(C2:C8, A2:A8="蘋果紅茶", B2:B8="信義"))

篩選、排序、加總想一次寫完的話,用 QUERY:

Google 試算表公式
fx

QUERY 版本

=QUERY( A1:D8, "select sum(C) where A='蘋果紅茶' and B='信義' label sum(C) ''", 1 )

這兩種分別在 FILTER 函式 和 QUERY 基礎 有完整教學。

我自己會留著 D 函式的情境只有兩個:檔案本來就是用它寫的,不想改;或是想讓不會寫公式的同事,直接改條件區的儲存格就能換篩選。除此之外,我都用上面的寫法。

我是喜特先生,Mr. Sheet,我們下個教學見!

分享:
#資料庫函式#條件區#DSUM#DGET
喜特先生 Mr. Sheet

喜特先生 Mr. Sheet

數據分析師/商業分析師

八年工作經驗,跨不同業界解決數據需求。做過的案例都整理在作品集。

接下來可以

相關文章

查看所有文章

留言討論

共 0 則留言

訂閱電子報,新文章上線就通知你

免費,隨時可取消。

送出即表示同意服務條款與隱私權政策。