Thep Excel

COUNTนับจำนวนแถวที่มีค่าไม่ว่างในคอลัมน์

COUNT นับจำนวนแถวที่คอลัมน์มีค่าไม่ว่าง (non-blank) รองรับตัวเลข วันที่ และข้อความ แต่ไม่นับ Boolean ทำงานภายใต้ filter context และเกิด context transition เมื่อใช้ใน row context เหมาะสำหรับนับรายการที่มีข้อมูลในคอลัมน์เฉพาะ แต่ควรใช้ COUNTROWS แทนเมื่อนับแถวทั้งหมด

fx
=COUNT(<column>)

ความนิยม9/10
ความยาก2/10
ประโยชน์9/10

อัปเดต 18 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
column column คอลัมน์ที่ต้องการนับจำนวนค่า รองรับประเภทตัวเลข วันที่ และข้อความ ต้องอ้างอิงด้วย Table[Column] syntax เช่น Sales[Amount] หรือ Orders[ShipDate] ไม่รองรับ Boolean และไม่สามารถใช้ expression ที่ซับซ้อนได้

Additional Notes

COUNT เป็นฟังก์ชัน aggregation พื้นฐานใน DAX ที่นับจำนวนแถวในคอลัมน์ที่มีค่าไม่ว่าง (non-blank) รองรับข้อมูลประเภทตัวเลข วันที่ และข้อความ แต่ไม่สามารถนับค่า Boolean (TRUE/FALSE) ได้

ฟังก์ชันนี้ทำงานภายใต้ filter context ปัจจุบัน ทำให้ผลลัพธ์เปลี่ยนตามการเลือก slicer หรือ filter ใน report ซึ่งเป็นพฤติกรรมที่เราต้องการส่วนใหญ่เวลาทำ report 📊

.

สำหรับผู้ที่มาจาก Excel ต้องระวังนะครับ… COUNT ใน DAX แตกต่างจาก COUNT ใน Excel อย่างมาก

COUNT ใน Excel นับเฉพาะตัวเลข แต่ COUNT ใน DAX นับทั้งตัวเลข วันที่ และข้อความด้วย

.

นอกจากนี้ Microsoft แนะนำให้ใช้ COUNTROWS แทน COUNT เมื่อต้องการนับจำนวนแถวทั้งหมดของตาราง เพราะ COUNTROWS มี performance ดีกว่า ชัดเจนกว่า และไม่ขึ้นกับว่าคอลัมน์ใดมีค่าว่างหรือไม่

ความแตกต่างระหว่าง COUNT, COUNTA และ COUNTROWS

เคยสงสัยมั้ยครับว่า… ทำไม DAX ถึงมีฟังก์ชันนับตั้ง 3 ตัว? 🤔

  • COUNT: นับค่าไม่ว่าง (ตัวเลข วันที่ ข้อความ) ไม่นับ Boolean
  • COUNTA: นับค่าไม่ว่างทุกประเภท รวมถึง Boolean (TRUE/FALSE)
  • COUNTROWS: นับจำนวนแถวทั้งหมดในตาราง ไม่ขึ้นกับว่าคอลัมน์ใดมีค่าหรือไม่ (Microsoft แนะนำให้ใช้แทน COUNT เมื่อนับแถว)

.

การเข้าใจความแตกต่างเหล่านี้สำคัญมากเพราะการเลือกใช้ฟังก์ชันที่เหมาะสมจะทำให้ DAX measure ของคุณมี performance ดีขึ้นและอ่านง่ายขึ้น

Context Behavior: Row Context vs Filter Context

COUNT ทำงานภายใน filter context ซึ่งหมายความว่าผลลัพธ์จะเปลี่ยนตามการ filter ที่ active อยู่ใน visual ปัจจุบัน

.

เมื่อใช้ใน measure ฟังก์ชันนี้จะตอบสนองต่อ slicer, visual filter และ cross-filtering จาก visual อื่น ๆ อัตโนมัติ

นอกจากนี้เมื่อเรียกใช้ COUNT ใน row context (เช่นใน calculated column) จะเกิด context transition ทำให้ row context กลายเป็น filter context ซึ่งอาจส่งผลต่อ performance ได้ครับ

เมื่อไหร่ควรใช้ COUNT

ใช้ COUNT เมื่อต้องการนับเฉพาะแถวที่มีค่าในคอลัมน์เฉพาะเจาะจง

.

เช่น นับจำนวนออเดอร์ที่มีการระบุยอดเงิน (ไม่นับออเดอร์ที่ Amount เป็น BLANK) หรือนับจำนวนธุรกรรมที่มีการระบุวันที่จัดส่ง (ไม่นับแถวที่ ShipDate ว่าง)

.

แต่ถ้าต้องการนับจำนวนแถวทั้งหมดของตารางโดยไม่สนใจว่าคอลัมน์ใดมีค่าหรือไม่ ให้ใช้ COUNTROWS แทนครับ 😎

How it works

นับจำนวนรายการที่มียอดขาย

นับจำนวนออเดอร์ที่มีการระบุยอดเงินจริง ไม่นับออเดอร์ที่ Amount ยังเป็น BLANK

นับจำนวนวันที่มีธุรกรรม

นับจำนวนวันที่มีการบันทึกข้อมูลจริง ใช้สำหรับ KPI ที่ต้องรู้จำนวนวันที่มีข้อมูล

Data Quality Analysis

เปรียบเทียบ COUNT กับ COUNTROWS เพื่อตรวจสอบความสมบูรณ์ของข้อมูล หาแถวที่มีค่าว่าง

นับรายการตามเงื่อนไขด้วย CALCULATE

ใช้ COUNT ร่วมกับ CALCULATE เพื่อนับจำนวนรายการที่ตรงเงื่อนไขเฉพาะ เช่น High Value Transactions

Examples

ตัวอย่างที่ 1: Basic COUNT – นับจำนวนรายการที่มียอดขายSales Record Count = COUNT(Sales[Amount]) // Context: Sales table มี Amount column เก็บยอดเงิน // Result: คืนจำนวนแถวที่ Amount ไม่ว่าง เช่น 1,234

COUNT นับเฉพาะแถวที่คอลัมน์มีค่า ถ้า Sales table มี 1,500 แถวแต่มี 266 แถวที่ Amount เป็น BLANK ผลลัพธ์จะเป็น 1,234

ฟังก์ชันนี้ทำงานภายใต้ filter context ปัจจุบัน ดังนั้นเมื่อใช้ใน visual ที่มี slicer เลือก Year = 2024 ผลลัพธ์จะนับเฉพาะแถวปี 2024 ที่มี Amount ครับ

fx
Sales Record Count =
COUNT(Sales[Amount])

// Context: Sales table มี Amount column เก็บยอดเงิน
// Result: คืนจำนวนแถวที่ Amount ไม่ว่าง เช่น 1,234

ผลลัพธ์คืนจำนวนแถวที่ Sales[Amount] ไม่ว่าง ตัวอย่าง: 1,234 แถว
ตัวอย่างที่ 2: COUNT กับ CALCULATE – นับตามเงื่อนไขเฉพาะHigh Value Sales Count = CALCULATE( COUNT(Sales[Amount]), Sales[Amount] > 1000 ) // Context: นับเฉพาะ sales ที่มียอดมากกว่า 1,000 // Result: จำนวนรายการที่ Amou…

CALCULATE เปลี่ยน filter context โดยเพิ่ม filter condition Sales[Amount] > 1000 ทำให้ COUNT นับเฉพาะแถวที่ยอดขายสูง

วิธีนี้เหมาะสำหรับสร้าง KPI เช่น "High Value Transactions" หรือ "Premium Orders" โดยไม่ต้องสร้างคอลัมน์เพิ่มใน data model

ผลลัพธ์ยังคงตอบสนองต่อ slicer อื่น ๆ ใน report ครับ 📊

fx
High Value Sales Count =
CALCULATE(
COUNT(Sales[Amount]),
Sales[Amount] > 1000
)

// Context: นับเฉพาะ sales ที่มียอดมากกว่า 1,000
// Result: จำนวนรายการที่ Amount > 1000

ผลลัพธ์คืนจำนวนแถวที่ Sales[Amount] มากกว่า 1,000 ตัวอย่าง: 234 แถว
ตัวอย่างที่ 3: COUNT กับ Filter Context – นับตาม CategorySales Count by Category = COUNT(Sales[Amount]) // Context: ใช้ใน visual ที่มี Products[Category] เป็น axis // Sales table มี relationship กับ Products table //…

COUNT ทำงานภายใต้ filter context ของ visual เมื่อสร้าง table visual ที่มี Products[Category] เป็น column DAX engine จะสร้าง filter context สำหรับแต่ละ Category อัตโนมัติ

ผลลัพธ์จึงแตกต่างกันในแต่ละแถว นี่คือ filter context propagation ผ่าน relationship ระหว่าง Sales และ Products table ซึ่งเป็นจุดเด่นของ DAX เลยครับ 😎

fx
Sales Count by Category =
COUNT(Sales[Amount])

// Context: ใช้ใน visual ที่มี Products[Category] เป็น axis
// Sales table มี relationship กับ Products table
// Result: ผลลัพธ์แยกตาม Category (Electronics: 456, Furniture: 312)

ผลลัพธ์ผลลัพธ์เปลี่ยนตาม filter context: Electronics = 456, Furniture = 312, Clothing = 466
ตัวอย่างที่ 4: Data Quality Check – เปรียบเทียบ COUNT กับ COUNTROWSData Completeness % = VAR TotalRows = COUNTROWS(Sales) VAR FilledRows = COUNT(Sales[Amount]) VAR MissingRows = TotalRows – FilledRows VAR CompletenessPercent =…

ใช้ VAR เก็บ intermediate result เพื่อให้ formula อ่านง่าย COUNTROWS นับแถวทั้งหมด (1,500) COUNT นับแถวที่มี Amount (1,234) ส่วนต่าง 266 แถวคือแถวที่ Amount เป็น BLANK

DIVIDE คำนวณเปอร์เซ็นต์และป้องกัน division by zero ด้วย argument ที่ 3 = 0

วิธีนี้เหมาะสำหรับ data quality monitoring ก่อนสร้าง production report ส่วนตัวผมใช้เทคนิคนี้ตรวจสอบข้อมูลก่อนส่ง report ให้ลูกค้าเสมอครับ 📝

fx
Data Completeness % =
VAR TotalRows = COUNTROWS(Sales)
VAR FilledRows = COUNT(Sales[Amount])
VAR MissingRows = TotalRows – FilledRows
VAR CompletenessPercent = DIVIDE(FilledRows, TotalRows, 0)
RETURN
CompletenessPercent

// Context: คำนวณเปอร์เซ็นต์ความสมบูรณ์ของข้อมูล
// Result: 0.824 หมายถึง 82.4% ของแถวมี Amount

ผลลัพธ์คืน 0.824 หมายถึง 82.4% ของแถวมีข้อมูล Amount (1,234 จาก 1,500 แถว)

FAQs

COUNT ต่างจาก COUNTA อย่างไร?+

COUNT และ COUNTA ใน DAX ทำงานเหมือนกันเกือบทุกกรณี ความแตกต่างเดียวคือ COUNTA นับค่า Boolean (TRUE/FALSE) ได้ แต่ COUNT นับไม่ได้

ถ้าคอลัมน์เป็น Boolean ต้องใช้ COUNTA แทนนะครับ สำหรับตัวเลข วันที่ และข้อความ ทั้งสองฟังก์ชันนับได้เหมือนกัน

นอกจากนี้ทั้งสองฟังก์ชันยังนับ empty string ("") เป็นค่าที่ไม่ว่างด้วย

เมื่อไหร่ควรใช้ COUNT และเมื่อไหร่ควรใช้ COUNTROWS?+

ใช้ COUNTROWS เมื่อต้องการนับจำนวนแถวทั้งหมดของตาราง เพราะ performance ดีกว่า ชัดเจนกว่า และไม่ขึ้นกับว่าคอลัมน์ใดมี BLANK

ใช้ COUNT เฉพาะเมื่อต้องการนับแถวที่คอลัมน์เฉพาะมีค่า เช่น นับจำนวนออเดอร์ที่มีการระบุยอดเงิน (ไม่นับออเดอร์ที่ Amount ว่าง)

Microsoft แนะนำให้ใช้ COUNTROWS แทน COUNT เสมอเมื่อนับแถวทั้งหมดนะครับ 😎

COUNT นับ empty string ("") หรือไม่?+

ใช่ครับ COUNT นับ empty string ("") เป็นค่าที่ไม่ว่าง ถ้าคอลัมน์ข้อความมีค่า "" จะถูกนับใน COUNT

นี่ต่างจาก BLANK ที่จะไม่ถูกนับ ความแตกต่างนี้สำคัญเมื่อทำ data cleaning เพราะ empty string และ BLANK ไม่ใช่สิ่งเดียวกันใน DAX เลยนะครับ

ถ้าต้องการนับจำนวนค่าว่าง (BLANK) ควรใช้ฟังก์ชันไหน?+

ใช้ COUNTBLANK เพื่อนับจำนวน BLANK ในคอลัมน์โดยตรง

หรือใช้ COUNTROWS – COUNT เพื่อคำนวณจำนวนแถวที่มีค่าว่าง เช่น Missing Amount = COUNTROWS(Sales) – COUNT(Sales[Amount]) จะบอกจำนวนแถวที่ Amount เป็น BLANK

ส่วนตัวผมชอบใช้วิธีที่สองเพราะเห็นภาพชัดกว่าครับ 📊

COUNT ใน DAX ต่างจาก COUNT ใน Excel อย่างไร?+

COUNT ใน Excel นับเฉพาะตัวเลข แต่ COUNT ใน DAX นับทั้งตัวเลข วันที่ และข้อความ (ไม่นับ Boolean)

นอกจากนี้ COUNT ใน DAX ทำงานภายใต้ filter context ของ visual ทำให้ผลลัพธ์เปลี่ยนตาม slicer และ filter ต่าง ๆ อัตโนมัติ ส่วน COUNT ใน Excel เป็น worksheet function ที่นับเฉพาะ range ที่ระบุ

พอมาใช้ DAX ต้องปรับความคิดใหม่นิดนึงนะครับ 😅

ทำไม COUNT บางครั้งคืนค่า BLANK แทนที่จะเป็น 0?+

COUNT คืนค่า BLANK เมื่อไม่มีแถวใดที่ตรงเงื่อนไข filter context ปัจจุบัน

นี่ช่วยแยก "ไม่มีข้อมูล" (BLANK) ออกจาก "มีข้อมูลแต่นับได้ 0 แถว" ซึ่งเป็นสิ่งที่แตกต่างกัน

ถ้าต้องการแปลง BLANK เป็น 0 ใช้ COUNT(Sales[Amount]) + 0 หรือ IF(ISBLANK(COUNT(Sales[Amount])), 0, COUNT(Sales[Amount])) ครับ

ถ้าต้องการนับตามเงื่อนไขที่ซับซ้อน ควรใช้ฟังก์ชันไหน?+

ใช้ COUNTX หรือ COUNTAX เพื่อนับโดยใช้ expression ที่คำนวณต่อแต่ละแถว หรือใช้ CALCULATE(COUNT(…), filter conditions) เพื่อนับภายใต้เงื่อนไขที่กำหนด

COUNTX เหมาะสำหรับ expression ที่ซับซ้อน เช่น COUNTX(Sales, IF(Sales[Quantity] * Sales[Price] > 1000, 1))

ส่วน CALCULATE เหมาะสำหรับ filter condition ที่ชัดเจน ส่วนตัวผมชอบใช้ CALCULATE เพราะอ่านง่ายกว่าครับ 😎

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ COUNT จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้COUNTAggregation
Aggregation (7)
AVERAGE

AVERAGE คำนวณค่าเฉลี่ยเลขคณิตของตัวเลขทั้งหมดในคอลัมน์ โดยข้าม blank cells และข้อความ แต่นับค่า 0 เข้าในการคำนวณ ซึ่งทำให้ค่าเฉลี่ยอาจต่ำลงถ้ามีค่า 0 จำนวนมาก ทำงานภายใต้ filter context ปัจจุบันและทำ context transition ใน calculated column ทำให้สามารถอ้างอิงคอลัมน์จากตารางอื่นผ่าน relationship ได้

COUNTA

COUNTA นับจำนวนเซลล์ที่มีค่าไม่ว่าง (non-blank) ในคอลัมน์ โดยรวมตัวเลข ข้อความ วันที่ และค่าตรรกะ ต่างจาก COUNT ที่นับเฉพาะตัวเลขเท่านั้น

COUNTAX

COUNTAX ประเมินนิพจน์ต่อแถวในตาราง แล้วนับจำนวนผลลัพธ์ที่ไม่ว่าง เหมาะกับการนับค่าที่อาจเป็นข้อความ ตรรกะ หรือนิพจน์ที่ซับซ้อน ไม่ใช่แค่ตัวเลข

COUNTBLANK

COUNTBLANK นับจำนวนค่า BLANK ในคอลัมน์ ช่วยวัดความครบถ้วนของข้อมูลและตรวจสอบคุณภาพข้อมูลภายใต้บริบทตัวกรองปัจจุบัน

COUNTROWS

COUNTROWS เป็นฟังก์ชันการรวม (Aggregation) ที่นับจำนวนแถวในตารางที่ระบุ ไม่ว่าจะเป็นตารางจริงในโมเดลหรือตารางเสมือน (Virtual Table) จากฟังก์ชันอื่นๆ เช่น FILTER, VALUES, DISTINCT นับเท่าไหร่? ผลลัพธ์ก็คือจำนวนแถวเต็ม ๆ

COUNTX

COUNTX ไล่ประเมินนิพจน์ทีละแถวในตาราง แล้วนับจำนวนแถวที่ได้ผลลัพธ์ไม่ว่าง เหมาะสำหรับการนับจากค่าที่คำนวณต่อแถว ไม่ใช่นับคอลัมน์ตรง ๆ

DISTINCTCOUNT

DISTINCTCOUNT นับจำนวนค่าที่แตกต่างกันทั้งหมดในคอลัมน์ รวมถึง BLANK values ถ้าไม่มีแถวข้อมูล จะคืนค่า BLANK

Filter (1)
CALCULATE

CALCULATE เป็นฟังก์ชันหลักที่สำคัญที่สุดใน DAX ใช้สำหรับ evaluate expression ภายใต้ filter context ที่ถูกปรับเปลี่ยน สามารถเพิ่มตัวกรองใหม่ ลบตัวกรองเดิม หรือแทนที่ filter ที่มีอยู่ได้ รองรับทั้ง Boolean expression และ table expression เป็น filter arguments พร้อม filter modifier functions เช่น REMOVEFILTERS, ALL, ALLEXCEPT, KEEPFILTERS เพื่อควบคุมการกรองอย่างละเอียด มีพฤติกรรมพิเศษคือ context transition ที่เปลี่ยน row context เป็น filter context โดยอัตโนมัติ ทำให้เป็นเครื่องมือหลักในการสร้าง measure ที่ซับซ้อนและ calculated column ที่ต้องใช้ aggregation

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่