TOTALQTD คำนวณยอดสะสมตั้งแต่วันแรกของไตรมาส (Q1/Q2/Q3/Q4) จนถึงวันที่ล่าสุดใน filter context ปัจจุบัน
.
ส่วนตัวผมใช้บ่อยมากตอน analyze quarterly performance และการวิเคราะห์ KPI รายไตรมาสครับ
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| Expression | expression | Expression ที่ต้องการคำนวณยอดสะสม QTD เช่น SUM(Sales[Amount]) หรือ [Total Sales] สามารถเป็น measure reference หรือ aggregation expression ใดๆ ที่ return scalar value | |
| Dates | column | Column ที่เก็บวันที่จาก Date table ที่มีวันที่ต่อเนื่องครบถ้วนตลอดทั้งปี เช่น ‘Date'[Date] หรือ DateTime[DateKey] ต้อง mark as date table ในโมเดลเพื่อให้ time intelligence function ทำงานถูกต้อง | |
| [Filter]ไม่บังคับ | expression | ไม่มีการกรองเพิ่มเติม | Boolean expression หรือ table expression ที่ใช้กรองข้อมูลเพิ่มเติมก่อนคำนวณ QTD เช่น Products[Category] = “Electronics” ทำงานภายใน CALCULATE context ตาม CALCULATE function rules |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
TOTALQTD เป็น DAX time intelligence function ที่ออกแบบมาเพื่อคำนวณยอดสะสมตั้งแต่วันแรกของไตรมาส (1 มกราคม, 1 เมษายน, 1 กรกฎาคม, 1 ตุลาคม) จนถึงวันที่ล่าสุดในบริบทปัจจุบัน
ที่เจ๋งคือ TOTALQTD จะอ่านวันที่จาก filter context โดยอัตโนมัติ เพื่อกำหนดว่าอยู่ไตรมาสไหน แล้วถึงวันแรกของไตรมาสนั้น ไม่ต้องคิดว่า Q1 เริ่มต้นเมื่อไหร่เอง DAX จะจัดการให้หมดแล้ว 😎
ส่วนตัวผมใช้ TOTALQTD บ่อยมากตอน build quarterly KPI dashboard หรือวิเคราะห์ quarterly performance trend ของฝ่ายขายครับ
แสดงยอดสะสมตั้งแต่ต้นไตรมาสถึงวันที่ล่าสุดในบริบท
ใช้กับเมเชอร์อื่น ๆ เพื่อทำตัวชี้วัดสะสมระดับไตรมาส
ตัวอย่างพื้นฐานของการใช้ TOTALQTD โดยรวมยอดขายทั้งหมดตั้งแต่วันแรกของไตรมาสปัจจุบัน
สมมติว่าวันนี้เป็นวันที่ 15 เมษายน 2024 (Q2) measure นี้จะรวมยอดขายตั้งแต่ 1 เมษายน – 15 เมษายน 2024 ส่วนตัวผมใช้แบบนี้ใน KPI card และ quarterly revenue tracking sheet บ่อยมากครับ 😎
ใช้ Filter argument เพื่อคำนวณ QTD เฉพาะหมวดสินค้า Electronics โดยกรองข้อมูลก่อนคำนวณยอดสะสม
สมมติว่าใน Q1 2024 มียอดขาย Electronics เดือนละ (ม.ค. 5,000 / ก.พ. 7,000 / มี.ค. 8,000) แล้ว ณ วันที่ 31 มี.ค. measure นี้จะ return 20,000 เป็นยอด QTD Electronics ครับ
DAX มี syntax ที่สมาร์ท คุณสามารถใส่ multiple filter arguments โดยเรียงลำดับกันไปได้ โดยจะ AND ทั้งหมด (เปรียบเทียบกับ CALCULATE ที่ใช้เครื่องหมายจุลภาค)
นี่เป็นวิธีที่ efficient เพราะไม่ต้อง nest CALCULATE หรือใช้ && เพื่อ combine conditions ครับ 💡
TOTALQTD เป็น wrapper function ที่ทำให้เขียนโค้ด DAX ง่ายขึ้น โดยทำงานเทียบเท่ากับ CALCULATE ร่วมกับ DATESQTD
DATESQTD คืนตารางวันที่ของช่วง QTD (เช่น 1 เมษายน – 15 เมษายน) แล้ว CALCULATE ใช้ตารางนั้นเป็น filter ส่วน TOTALQTD รวมสองอย่างในคำสั่งเดียว ทำให้อ่านง่ายกว่า ส่วนตัวผมชอบใช้ TOTALQTD มากกว่าครับ เพราะสั้นและชัดเจน 😎
ตัวอย่าง real-world ที่ใช้ VAR…RETURN pattern เพื่อสร้าง measure ที่ซับซ้อน โดยคำนวณ CurrentQTD ด้วย TOTALQTD จากนั้นคำนวณ PreviousQTD โดยใช้ CALCULATE ร่วมกับ SAMEPERIODLASTYEAR เพื่อเลื่อน context ไปปีก่อนหน้า
สมมติ CurrentQTD = 150,000 และ PreviousQTD = 120,000 ผลลัพธ์ = (150,000 – 120,000) / 120,000 = 0.25 หรือ 25% growth ส่วนตัวผมใช้ pattern นี้บ่อยมากตอน quarterly analysis dashboard ครับ 💡
DATESQTD เป็น table function ที่ return ตารางของวันที่ในช่วง quarter-to-date (เช่น 1 เมษายน – 15 เมษายน) ซึ่งต้องใช้ร่วมกับ CALCULATE เพื่อคำนวณค่า expression
ส่วน TOTALQTD เป็น wrapper function ที่รวมทั้งสองอย่างเข้าด้วยกัน คือ return ค่าผลลัพธ์ของ expression ที่คำนวณแล้วโดยตรง ส่วนตัวผมชอบใช้ TOTALQTD มากกว่าครับ เพราะอ่านง่ายและเขียนสั้นกว่า 😎
TOTALQTD คำนวณยอดสะสมตั้งแต่วันแรกของ Quarter (ไตรมาส) ในขณะที่ TOTALMTD คำนวณยอดสะสมตั้งแต่วันแรกของ Month (เดือน)
ถ้าวันนี้เป็น 15 เมษายน 2024 TOTALQTD จะรวมตั้งแต่ 1 เมษายน ส่วน TOTALMTD จะรวมตั้งแต่ 1 เมษายน (วันแรกของเดือนเดียวกัน) ซึ่งผลลัพธ์อาจเหมือนกันในช่วง 1-2 สัปดาห์แรกของไตรมาส ครับ 💡
Date table ต้องมีวันที่ต่อเนื่องครบถ้วนตลอดทั้งปี (ไม่มีวันที่ขาดหาย) เพื่อให้ time intelligence function เช่น TOTALQTD ทำงานได้ถูกต้อง
หากวันที่ขาดหายหรือไม่ต่อเนื่อง ผลลัพธ์อาจคำนวณผิดพลาดหรือระบบไม่สามารถหาวันแรกของไตรมาสได้ถูกต้อง ควร mark as date table ในโมเดลเพื่อให้ DAX engine ตรวจสอบ continuity ได้ครับ 💡
สามารถใช้ได้ แต่ไม่แนะนำเพราะ calculated column คำนวณที่ row context และจะคำนวณ QTD สำหรับทุกแถว ซึ่งอาจไม่ได้ผลลัพธ์ตามที่ต้องการและใช้ memory มาก
แนะนำให้ใช้ TOTALQTD ใน measure เท่านั้น เพื่อให้คำนวณ dynamic ตาม filter context และประหยัด memory ครับ 😎
ฟังก์ชันที่ผู้เขียนโยงไว้กับ TOTALQTD จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
DATESBETWEEN คืนตารางวันที่ที่อยู่ระหว่าง StartDate และ EndDate (รวมวันเริ่ม/วันจบ) เหมาะกับการใช้เป็นตัวกรองเวลาใน CALCULATE เพื่อคำนวณตามช่วงวันที่ที่กำหนดเอง
DATESQTD คืนตารางวันที่ของช่วงตั้งแต่ต้นไตรมาสถึงวันที่ล่าสุดในบริบทปัจจุบัน เหมาะสำหรับสร้างมาตรวัด QTD ใน CALCULATE โดยทำงานร่วมกับ Time Intelligence Functions ตัวอื่นๆ ได้ดี และควรใช้คู่กับ ShowValueForDates pattern เพื่อป้องกันการแสดงค่าในอนาคต
ENDOFQUARTER คืนตารางวันที่ของวันสิ้นไตรมาสตามบริบทวันที่ปัจจุบัน เหมาะกับการใช้เป็นตัวกรองเวลาใน CALCULATE เพื่อประเมินมาตรวัด ณ วันสิ้นไตรมาส
STARTOFQUARTER คืนตารางวันที่ที่มีวันแรกของไตรมาสในบริบทตัวกรองปัจจุบัน (single-row table) ใช้เป็นตารางตัวกรองใน CALCULATE หรือใช้ MINX เพื่อแปลงเป็น scalar date
คำนวณยอดสะสมตั้งแต่ต้นเดือน (Month-to-Date) ของ Expression ตามคอลัมน์วันที่ที่กำหนด เป็นทางลัดของ CALCULATE + DATESMTD
คำนวณยอดสะสมตั้งแต่ต้นสัปดาห์ (Week-to-Date) ของ Expression ตามคอลัมน์วันที่ที่กำหนด โดยรวมข้อมูลจากวันแรกของสัปดาห์จนถึงวันปัจจุบันในบริบท
TOTALYTD คำนวณยอดสะสมตั้งแต่ต้นปี (Year-to-Date) ของ expression ใดๆ โดยอิงจาก Date table และสามารถกำหนด fiscal year end date เพื่อรองรับปีงบประมาณที่ไม่ตรงกับปีปฏิทินได้
.
ส่วนตัวผมใช้บ่อยมากตอนต้องวิเคราะห์ยอดขาย KPI และรายงานทางการเงินที่ต้องการติดตามความก้าวหน้าตลอดทั้งปีครับ
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
อีเมลของคุณจะไม่ถูกเผยแพร่