DATESMTD คืนตารางวันที่ของช่วงตั้งแต่ต้นเดือนถึงวันที่ล่าสุดใน filter context เหมาะกับการทำยอดสะสมตั้งแต่ต้นเดือน (MTD) โดยใช้ร่วมกับ CALCULATE และควรใช้คู่กับ ShowValueForDates pattern เพื่อไม่ให้แสดงค่าในวันที่ยังไม่มีข้อมูล
=DATESMTD(<Dates>)
=DATESMTD(<Dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Dates | column | Yes | คอลัมน์วันที่จากตารางวันที่ (Date table) ที่ถูก mark เป็น Date table แล้ว ต้องเป็นคอลัมน์ที่มีวันที่ครบถ้วนตั้งแต่ 1 ม.ค. ถึง 31 ธ.ค. ของทุกปีที่มีข้อมูล |
ใช้เป็นตัวกรองเวลาใน CALCULATE เพื่อให้ Measure คำนวณเฉพาะช่วง MTD สำหรับติดตามเป้าหมายรายเดือน
ใช้ร่วมกับ DATEADD เพื่อเปรียบเทียบยอด MTD ปัจจุบันกับยอด MTD ของเดือนก่อนหน้า
เช่น จำนวนออเดอร์สะสม หรือจำนวนลูกค้าใหม่สะสมตั้งแต่ต้นเดือน เพื่อดูความคืบหน้าระหว่างเดือน
ใช้ร่วมกับ ShowValueForDates pattern เพื่อไม่แสดงค่าในวันที่ที่ยังไม่มีข้อมูลจริง
Sales MTD = CALCULATE( [Sales Amount], DATESMTD('Date'[Date]) )Sales MTD =
CALCULATE(
[Sales Amount],
DATESMTD('Date'[Date])
)
ถ้าวันที่ใน filter context คือ 15 มิ.ย. 2024 จะคืนยอดขายรวมตั้งแต่ 1-15 มิ.ย. 2024
-- Measure ช่วยเช็ควันที่มีข้อมูล (ซ่อนไว้) ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX(Sales[OrderDate]), REMOVEFILTERS() ) VAR FirstDateVisible…=-- Measure ช่วยเช็ควันที่มีข้อมูล (ซ่อนไว้)
ShowValueForDates =
VAR LastDateWithData =
CALCULATE(
MAX(Sales[OrderDate]),
REMOVEFILTERS()
)
VAR FirstDateVisible = MIN('Date'[Date])
RETURN
FirstDateVisible <= LastDateWithData
-- Measure หลักที่ใช้แสดงผล
Sales MTD =
IF(
[ShowValueForDates],
CALCULATE(
[Sales Amount],
DATESMTD('Date'[Date])
)
)
แสดงยอด MTD เฉพาะวันที่มีข้อมูลจริง วันที่ในอนาคตจะแสดงเป็น BLANK
-- MTD ปัจจุบัน Sales MTD = CALCULATE( [Sales Amount], DATESMTD('Date'[Date]) ) -- MTD เดือนก่อน (PMTD) Sales PMTD = CALCULATE( [Sales MTD], DATEADD('Date'[Date…-- MTD ปัจจุบัน
Sales MTD =
CALCULATE(
[Sales Amount],
DATESMTD('Date'[Date])
)
-- MTD เดือนก่อน (PMTD)
Sales PMTD =
CALCULATE(
[Sales MTD],
DATEADD('Date'[Date], -1, MONTH)
)
ถ้าวันที่ปัจจุบันคือ 15 มิ.ย. 2024 - Sales MTD = ยอด 1-15 มิ.ย. 2024 และ Sales PMTD = ยอด 1-15 พ.ค. 2024
MTD Growth % = VAR CurrentMTD = [Sales MTD] VAR PreviousMTD = [Sales PMTD] VAR Growth = DIVIDE( CurrentMTD - PreviousMTD, PreviousMTD, BLANK() ) RETURN GrowthMTD Growth % =
VAR CurrentMTD = [Sales MTD]
VAR PreviousMTD = [Sales PMTD]
VAR Growth =
DIVIDE(
CurrentMTD - PreviousMTD,
PreviousMTD,
BLANK()
)
RETURN
Growth
ถ้า Sales MTD = 150,000 และ Sales PMTD = 120,000 จะได้ 25% (เพิ่มขึ้น 25%)
Sales MTD Fiscal = CALCULATE( [Sales Amount], DATESMTD(FiscalCalendar) )Sales MTD Fiscal =
CALCULATE(
[Sales Amount],
DATESMTD(FiscalCalendar)
)
คำนวณยอด MTD ตาม Fiscal Calendar ที่กำหนด
MTD Dates Debug = DATESMTD('Date'[Date])MTD Dates Debug =
DATESMTD('Date'[Date])
ได้ตารางวันที่ในช่วง MTD เพื่อตรวจสอบว่า filter ทำงานถูกต้อง
Daily Running Total (Month) = CALCULATE( [Sales Amount], DATESMTD('Date'[Date]) )=Daily Running Total (Month) =
CALCULATE(
[Sales Amount],
DATESMTD('Date'[Date])
)
แต่ละวันจะแสดงยอดสะสมตั้งแต่ต้นเดือนจนถึงวันนั้นๆ
คืนค่าเป็นตารางของวันที่ (Table) จึงมักใช้เป็นตัวกรองภายใน CALCULATE เพื่อให้ได้ค่าสเกลาร์จาก Measure ถ้าใช้เดี่ยวๆ จะได้ตารางที่มีคอลัมน์เดียวคือวันที่ในช่วง MTD
ปัญหานี้เจอบ่อยครับ 😅 สาเหตุหลักๆ คือ: 1) ตาราง Date ไม่ได้ถูก mark เป็น Date table 2) คอลัมน์วันที่มีวันที่ไม่ต่อเนื่อง (ต้องมีทุกวันตั้งแต่ 1 ม.ค. ถึง 31 ธ.ค.) 3) มี relationship ไม่ถูกต้องระหว่าง Date table กับ Fact table
DATESMTD คืนตารางวันที่ ส่วน TOTALMTD คืนค่าผลลัพธ์เลย ใช้ DATESMTD เมื่อต้องการความยืดหยุ่นมากกว่า เช่น ใช้ร่วมกับ IF หรือ filter อื่นๆ ใน CALCULATE ส่วน TOTALMTD เหมาะกับการใช้งานง่ายๆ ที่ต้องการผลลัพธ์ตรงๆ
เพื่อไม่ให้แสดงค่าในวันที่ที่ยังไม่มีข้อมูลจริง เช่น ถ้าวันนี้คือ 15 มิ.ย. แต่รายงานแสดงทั้งเดือน วันที่ 16-30 ยังไม่มีข้อมูล ถ้าไม่ใช้ pattern นี้อาจแสดงค่า 0 หรือค่าผิดพลาด ซึ่งทำให้รายงานดูไม่เป็นมืออาชีพครับ
ใช้ DATEADD ครับ เพราะ DATEADD จะ shift วันที่แบบ day-by-day ทำให้ช่วงวันที่ตรงกัน เช่น 1-15 มิ.ย. เทียบกับ 1-15 พ.ค. ส่วน PARALLELPERIOD จะคืนทั้งเดือนก่อนหน้า ซึ่งไม่เหมาะกับการเปรียบเทียบ MTD vs PMTD
ได้ครับ แต่มีข้อจำกัด: ไม่รองรับใน calculated columns หรือ Row-Level Security (RLS) rules ใน DirectQuery mode ใช้ได้เฉพาะใน Measures และ Calculated tables
DATESMTD คืนค่าเป็นตารางของวันที่ตั้งแต่วันแรกของเดือน จนถึงวันที่ล่าสุดใน filter context ปัจจุบัน ซึ่งเป็นพื้นฐานสำคัญสำหรับการคำนวณยอดสะสมตั้งแต่ต้นเดือน (Month-to-Date หรือ MTD)
.
ที่เจ๋งคือ DATESMTD ทำงานคล้ายกับ DATESYTD แต่ scope จำกัดอยู่ในเดือนเดียว ซึ่งเหมาะกับการติดตาม KPI รายเดือน เช่น ยอดขายสะสมตั้งแต่ต้นเดือน หรือจำนวนออเดอร์สะสมที่ต้องดูความคืบหน้าระหว่างเดือน
.
ส่วนตัวผมแนะนำให้ใช้ DATESMTD ร่วมกับ ShowValueForDates pattern เพื่อไม่ให้แสดงค่าในวันที่ยังไม่มีข้อมูล เช่น วันที่ในอนาคต วิธีนี้จะทำให้รายงานดูเป็นมืออาชีพมากขึ้นครับ 😎
DATESMTD(Dates) มีการทำงานเทียบเท่ากับสูตร:
DATESBETWEEN(
Dates,
STARTOFMONTH(LASTDATE(Dates)),
LASTDATE(Dates)
)
ซึ่งหมายความว่ามันจะหาวันแรกของเดือนจากวันที่ล่าสุดใน filter context แล้วสร้างตารางวันที่ตั้งแต่วันแรกของเดือนจนถึงวันที่ล่าสุดนั้น
เพื่อป้องกันการแสดงผลลัพธ์ในวันที่ที่ยังไม่มีข้อมูล (เช่น วันที่ในอนาคต) ให้สร้าง Measure ช่วยดังนี้:
ShowValueForDates =
VAR LastDateWithData =
CALCULATE(
MAX(Sales[OrderDate]),
REMOVEFILTERS()
)
VAR FirstDateVisible = MIN('Date'[Date])
VAR Result = FirstDateVisible <= LastDateWithData
RETURN
Result
.
แล้วนำไปใช้ร่วมกับ Sales MTD ดังนี้:
Sales MTD =
IF(
[ShowValueForDates],
CALCULATE(
[Sales Amount],
DATESMTD('Date'[Date])
)
)
Pattern นี้มาจาก DAXPatterns.com ซึ่งเป็นแหล่งอ้างอิงหลักสำหรับ DAX Patterns ครับ 💡