TOTALYTD คำนวณยอดสะสมตั้งแต่ต้นปี (Year-to-Date) ของ expression ใดๆ โดยอิงจาก Date table และสามารถกำหนด fiscal year end date เพื่อรองรับปีงบประมาณที่ไม่ตรงกับปีปฏิทินได้
.
ส่วนตัวผมใช้บ่อยมากตอนต้องวิเคราะห์ยอดขาย KPI และรายงานทางการเงินที่ต้องการติดตามความก้าวหน้าตลอดทั้งปีครับ
=TOTALYTD(<Expression>, <Dates> [, <Filter>] [, <YearEndDate>])
=TOTALYTD(<Expression>, <Dates> [, <Filter>] [, <YearEndDate>])
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| Expression | expression | Yes | Expression ที่ต้องการคำนวณยอดสะสม YTD เช่น SUM(Sales[Amount]) หรือ [Total Sales] สามารถเป็น measure reference หรือ aggregation expression ใดๆ ที่ return scalar value | |
| Dates | column | Yes | Column ที่เก็บวันที่จาก Date table ที่มีวันที่ต่อเนื่องครบถ้วนตลอดทั้งปี เช่น ‘Date'[Date] หรือ DateTime[DateKey] ต้อง mark as date table ในโมเดลเพื่อให้ time intelligence ทำงานถูกต้อง | |
| Filter | expression | Optional | ไม่มีการกรองเพิ่มเติม | Boolean expression หรือ table expression ที่ใช้กรองข้อมูลเพิ่มเติมก่อนคำนวณ YTD เช่น Products[Category] = “Electronics” ทำงานภายใน CALCULATE context ตาม CALCULATE function rules |
| YearEndDate | text | Optional | "12/31" (ปีปฏิทิน) | String literal ที่ระบุวันสิ้นปีงบประมาณในรูปแบบ “MM/DD” เช่น “06/30” สำหรับปีงบประมาณที่สิ้นสุด 30 มิถุนายน หรือ “03/31” สำหรับสิ้นสุด 31 มีนาคม ไม่ต้องระบุปี (ปีจะถูกละเว้น) ต้องเป็นข้อความคงที่ไม่สามารถใช้ column หรือ variable ได้ |
สร้าง measure ยอดขายสะสมตั้งแต่ต้นปีเพื่อแสดงใน dashboard และเปรียบเทียบกับเป้าหมายรายปี ช่วยให้เห็นความก้าวหน้าของยอดขายตลอดทั้งปีได้ชัดเจน
คำนวณรายได้หรือกำไรสะสมตามรอบปีงบประมาณที่เริ่มต้นไม่ใช่วันที่ 1 มกราคม เช่น องค์กรที่ใช้ปีงบประมาณเริ่ม 1 ก.ค. – 30 มิ.ย. สามารถระบุ YearEndDate เป็น "06/30"
วิเคราะห์ยอดขายสะสม YTD ของแต่ละหมวดสินค้าหรือแต่ละภูมิภาค เพื่อเปรียบเทียบประสิทธิภาพการขายระหว่าง category หรือ region ต่างๆ
แสดงกราฟเส้นของยอดสะสม YTD เทียบกับเดือนต่างๆ เพื่อดู trend การเติบโตของตัวเลขสำคัญตลอดทั้งปี เช่น ยอดขาย ลูกค้าใหม่ หรือ revenue
คำนวณยอดสะสม YTD เฉพาะหมวดสินค้าหรือเฉพาะช่องทางการขายบางช่องทาง โดยใช้ Filter argument เพื่อจำกัดขอบเขตข้อมูลที่ต้องการวิเคราะห์
Sales YTD = TOTALYTD( SUM(Sales[Amount]), 'Date'[Date] )Sales YTD =
TOTALYTD(
SUM(Sales[Amount]),
'Date'[Date]
)
ยอดขายสะสมตั้งแต่ 1 มกราคมจนถึงวันที่ล่าสุดใน filter context
Sales YTD Fiscal = TOTALYTD( SUM(Sales[Amount]), 'Date'[Date], , "06/30" )Sales YTD Fiscal =
TOTALYTD(
SUM(Sales[Amount]),
'Date'[Date],
,
"06/30"
)
ยอดขายสะสมตามรอบปีงบประมาณที่สิ้นสุด 30 มิถุนายน
Electronics YTD = TOTALYTD( SUM(Sales[Amount]), 'Date'[Date], Products[Category] = "Electronics" )Electronics YTD =
TOTALYTD(
SUM(Sales[Amount]),
'Date'[Date],
Products[Category] = "Electronics"
)
ยอดขายสะสม YTD เฉพาะหมวด Electronics
YTD vs PY = VAR CurrentYTD = TOTALYTD(SUM(Sales[Amount]), 'Date'[Date]) VAR PreviousYTD = CALCULATE( TOTALYTD(SUM(Sales[Amount]), 'Date'[Date]), SAMEPERIODLASTY…YTD vs PY =
VAR CurrentYTD =
TOTALYTD(SUM(Sales[Amount]), 'Date'[Date])
VAR PreviousYTD =
CALCULATE(
TOTALYTD(SUM(Sales[Amount]), 'Date'[Date]),
SAMEPERIODLASTYEAR('Date'[Date])
)
VAR Growth = CurrentYTD - PreviousYTD
RETURN
DIVIDE(Growth, PreviousYTD, 0)
อัตราการเติบโตของยอดสะสม YTD เทียบกับปีก่อนหน้า (เปอร์เซ็นต์)
Active Customers YTD Fiscal = VAR ActiveCustomers = DISTINCTCOUNT(Sales[CustomerID]) VAR Result = TOTALYTD( ActiveCustomers, 'Date'[Date], Customers[Status] = "…Active Customers YTD Fiscal =
VAR ActiveCustomers =
DISTINCTCOUNT(Sales[CustomerID])
VAR Result =
TOTALYTD(
ActiveCustomers,
'Date'[Date],
Customers[Status] = "Active",
"03/31"
)
RETURN
Result
จำนวน Active Customers สะสม YTD ตามปีงบประมาณ (สิ้นสุด 31 มีนาคม)
DATESYTD เป็น table function ที่ return ตารางของวันที่ในช่วง year-to-date (เช่น 1 ม.ค. – 31 มี.ค.) ซึ่งต้องใช้ร่วมกับ CALCULATE เพื่อคำนวณค่า expression
.
ส่วน TOTALYTD เป็น syntax sugar ที่รวมทั้งสองอย่างเข้าด้วยกัน คือ return ค่าผลลัพธ์ของ expression ที่คำนวณแล้วโดยตรง ส่วนตัวผมชอบใช้ TOTALYTD มากกว่าครับ เพราะอ่านง่ายและเขียนสั้นกว่า 😎
YearEndDate เป็น string literal ที่ใส่เป็นรูปแบบ “MM/DD” เช่น “06/30” หรือ “03/31” โดยไม่ต้องระบุปี เพราะ DAX จะละเว้นปีโดยอัตโนมัติ
.
สามารถเขียนได้หลายรูปแบบเช่น “6/30”, “Jun 30”, “30 June” ตาม locale ของ workbook แต่แนะนำให้ใช้ “MM/DD” เพื่อความชัดเจนครับ
Date table ต้องมีวันที่ต่อเนื่องครบถ้วนตลอดทั้งปี (ไม่มีวันที่ขาดหาย) เพื่อให้ time intelligence function เช่น TOTALYTD, DATESYTD และ CALCULATE ทำงานได้ถูกต้อง
.
หากวันที่ขาดหายหรือไม่ต่อเนื่อง ผลลัพธ์อาจคำนวณผิดพลาดหรือข้ามช่วงเวลาไป ควร mark as date table ในโมเดลเพื่อให้ DAX engine ตรวจสอบ continuity ได้ครับ 💡
ได้ แต่ไม่แนะนำให้ nest TOTALYTD ภายใน CALCULATE เพราะ TOTALYTD เองก็เป็น wrapper ของ CALCULATE อยู่แล้ว
.
การ nest อาจทำให้เกิด filter context ที่ซับซ้อนและผลลัพธ์ผิดพลาด ถ้าต้องการ filter เพิ่มเติม แนะนำให้ใช้ Filter argument ของ TOTALYTD แทน หรือใช้ CALCULATE ร่วมกับ DATESYTD โดยตรงครับ
สามารถใช้ได้ แต่ไม่แนะนำเพราะ calculated column คำนวณที่ row context และจะคำนวณ YTD สำหรับทุกแถว ซึ่งอาจไม่ได้ผลลัพธ์ตามที่ต้องการและใช้ memory มาก
.
แนะนำให้ใช้ TOTALYTD ใน measure เท่านั้น เพื่อให้คำนวณ dynamic ตาม filter context และประหยัด memory ครับ 😎
ใช้ CALCULATE ร่วมกับ SAMEPERIODLASTYEAR เพื่อเลื่อน filter context ไปปีที่แล้ว เช่น CALCULATE(TOTALYTD(SUM(Sales[Amount]), ‘Date'[Date]), SAMEPERIODLASTYEAR(‘Date'[Date]))
.
จะได้ยอดสะสม YTD ของปีที่แล้วในช่วงเดือนเดียวกัน ส่วนตัวผมใช้บ่อยมากตอนต้องเปรียบเทียบ year-over-year growth ครับ 💡
YearEndDate ของ TOTALYTD รองรับเฉพาะการกำหนดวันสิ้นปี ไม่รองรับการกำหนด fiscal quarter start date ที่ไม่ใช่วันแรกของเดือน
.
ถ้าต้องการใช้ fiscal calendar แบบ 4-4-5 หรือ ISO calendar แนะนำให้สร้าง custom calendar table และใช้ CALCULATE ร่วมกับ DATESBETWEEN หรือใช้ calendar-based time intelligence functions แทนครับ
TOTALYTD เป็น DAX time intelligence function ที่ออกแบบมาเพื่อคำนวณยอดสะสมตั้งแต่วันแรกของปีจนถึงวันที่ล่าสุดใน filter context ปัจจุบัน
.
ที่เจ๋งคือฟังก์ชันนี้รองรับ fiscal year (ปีงบประมาณ) ด้วย ทำให้องค์กรที่มีรอบปีงบประมาณไม่ตรงกับปีปฏิทินสามารถคำนวณยอดสะสมได้ถูกต้องตามรอบปีงบประมาณของตนเอง
.
ส่วนตัวผมใช้บ่อยมากครับ โดยเฉพาะเวลาต้องสร้าง measure ยอดขาย KPI และรายงานทางการเงินที่ต้องติดตามความก้าวหน้าตลอดทั้งปี 😎
TOTALYTD เป็น time intelligence function ที่ทำงานเทียบเท่ากับการเขียน CALCULATE ร่วมกับ DATESYTD
.
ที่ต้องระวังคือ DATESYTD จะ return table ของวันที่ในช่วง year-to-date ส่วน TOTALYTD จะ return ค่าผลลัพธ์ของ expression ที่คำนวณแล้ว ทำให้ใช้งานง่ายและอ่านโค้ดเข้าใจได้ทันทีครับ 💡