PREVIOUSMONTH คืนตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทปัจจุบัน เหมาะกับการทำ Measure เปรียบเทียบ Month-over-Month เช่น ยอดขายเดือนก่อนหน้า ข้อแตกต่างสำคัญกับ DATEADD คือ PREVIOUSMONTH คืนทั้งเดือนเสมอ ไม่ว่าจะเลือกวันไหนก็ตาม
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| dates | column | คอลัมน์วันที่จากตาราง Date ต้องเป็น DateTime หรือ Date ที่มีค่า Unique และครอบคลุมทั้งปี (1 ม.ค. – 31 ธ.ค.) |
PREVIOUSMONTH เป็น Time Intelligence Function ที่คืนค่า ตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทวันที่ปัจจุบัน
.
ที่เจ๋งคือ PREVIOUSMONTH ใช้งานง่ายมาก แค่ใส่คอลัมน์วันที่เข้าไปก็ได้ผลลัพธ์เลย แต่ที่ต้องเข้าใจคือมันคืน ทั้งเดือน เสมอ ไม่ว่าบริบทปัจจุบันจะเลือกวันไหนก็ตาม
.
PREVIOUSMONTH: คืน ทั้งเดือน ก่อนหน้า เสมอ (ถ้าเลือก 15-20 สิงหาคม จะได้ 1-31 กรกฎาคม)
DATEADD(-1, MONTH): เลื่อน แต่ละวัน ถอยหลัง 1 เดือน (ถ้าเลือก 15-20 สิงหาคม จะได้ 15-20 กรกฎาคม)
.
ส่วนตัวผมแนะนำให้ใช้ PREVIOUSMONTH เมื่อต้องการเปรียบเทียบ “ทั้งเดือน” กับ “ทั้งเดือน” แต่ถ้าต้องการ Month-to-Date หรือเปรียบเทียบวันต่อวัน ให้ใช้ DATEADD แทนครับ
.
เวลาทำ Dashboard ที่มีวันที่ในอนาคต ปัญหาคือ YTD หรือ MTD อาจแสดงค่าศูนย์สำหรับวันที่ยังไม่มีข้อมูล ซึ่งทำให้ Trend ดูผิดเพี้ยน
วิธีแก้คือใช้ ShowValueForDates Pattern จาก DAXPatterns.com ครับ
ShowValueForDates =
VAR LastDateWithData =
CALCULATE( MAX( Sales[OrderDate] ), REMOVEFILTERS() )
VAR FirstDateVisible = MIN( 'Date'[Date] )
RETURN
FirstDateVisible <= LastDateWithData
แล้วนำไปใช้ใน Measure หลักแบบนี้:
Sales PM =
IF(
[ShowValueForDates],
CALCULATE( [Sales Amount], PREVIOUSMONTH( 'Date'[Date] ) )
)
ทำ Measure เปรียบเทียบยอดขายเดือนปัจจุบันกับเดือนก่อนหน้า สำหรับ Dashboard ที่แสดง Trend
คำนวณ % การเติบโต (Growth Rate) เทียบกับเดือนก่อนหน้า เช่น ยอดขายโตขึ้น 15% จากเดือนก่อน
แสดง KPI หลายตัวพร้อมกันโดยเปรียบเทียบกับเดือนก่อนหน้า เช่น ยอดขาย, จำนวนออเดอร์, จำนวนลูกค้า
PREVIOUSMONTH('Date'[Date]) คืนตารางวันที่ 1-31 กรกฎาคม 2024 แล้ว CALCULATE ใช้ตารางนี้เป็น Filter Context ในการคำนวณ [Sales Amount]
Pattern นี้จาก DAXPatterns.com ป้องกัน Dashboard แสดงค่าศูนย์สำหรับเดือนที่ยังไม่มียอดขาย ทำให้ Trend Line ไม่ตกลงไปที่ศูนย์กลางเดือน
ใช้ VAR เก็บค่าแต่ละเดือน แล้วคำนวณผลต่าง IF ช่วยป้องกันไม่ให้แสดงค่าเมื่อเดือนใดเดือนหนึ่งไม่มีข้อมูล
DIVIDE ช่วยป้องกัน Error กรณีหารด้วยศูนย์ ผลลัพธ์ 0.25 หมายถึงยอดขายเพิ่มขึ้น 25% จากเดือนก่อน
ความแตกต่างนี้สำคัญมาก PREVIOUSMONTH เหมาะเมื่อต้องการเปรียบเทียบทั้งเดือน ส่วน DATEADD เหมาะสำหรับ Month-to-Date หรือเปรียบเทียบช่วงวันที่เดียวกัน
Pattern จาก DAXPatterns.com สำหรับกรณีที่เดือนปัจจุบันยังไม่จบ (เช่น วันที่ 15 ของเดือน) และต้องการเปรียบเทียบกับ 15 วันแรกของเดือนก่อนอย่างยุติธรรม
มักเกิดจาก 2 สาเหตุครับ: (1) ไม่มีข้อมูลของเดือนก่อนหน้าในตาราง Date เช่น ถ้าข้อมูลเริ่มที่มกราคม 2024 แล้วเลือกเดือนมกราคม จะไม่มีธันวาคม 2023 (2) บริบทวันที่ไม่ชัดเจน เช่น เลือกหลายเดือนปนกัน ทำให้ไม่รู้ว่าเดือนก่อนหน้าคือเดือนไหน
ต่างกันมากครับ! PREVIOUSMONTH คืน "ทั้งเดือน" ก่อนหน้าเสมอ ไม่ว่าบริบทปัจจุบันจะเลือกกี่วันก็ตาม ส่วน DATEADD เลื่อนแต่ละวันถอยหลัง 1 เดือน ถ้าเลือก 10 วัน ก็จะได้ 10 วันของเดือนก่อน ใช้ PREVIOUSMONTH เมื่อต้องการเปรียบเทียบ "เดือนต่อเดือน" ใช้ DATEADD เมื่อต้องการเปรียบเทียบ "ช่วงวันที่เดียวกัน"
ควรมากครับ เพราะ Time Intelligence Functions ต้องการตาราง Date ที่ (1) มีวันที่ครบทุกวันตลอดทั้งปี (2) ไม่มีวันซ้ำ (3) ถูก Mark เป็น Date Table ใน Data Model ถ้าใช้คอลัมน์วันที่จาก Fact Table โดยตรง อาจมีวันที่ขาดหายและทำให้ผลลัพธ์ผิดพลาด
เป็น Pattern จาก DAXPatterns.com สำหรับซ่อนค่าของวันที่ในอนาคต ถ้าไม่ใช้ Dashboard อาจแสดงค่า 0 หรือ BLANK สำหรับเดือนที่ยังไม่มีข้อมูล ทำให้ Trend Line ตกลงไปที่ศูนย์กลางเดือน ดูไม่สวยและเข้าใจผิดได้
ได้ครับ เช่น PREVIOUSMONTH(PREVIOUSMONTH('Date'[Date])) แต่ไม่แนะนำเพราะอ่านยากและช้ากว่า ถ้าต้องการถอยหลังหลายเดือน แนะนำใช้ DATEADD('Date'[Date], -2, MONTH) หรือ PARALLELPERIOD แทนครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ PREVIOUSMONTH จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
DATEADD คืนค่าตารางวันที่ ที่ถูกเลื่อนออกไปจากช่วงวันที่ใน Context ปัจจุบัน ตามจำนวน (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น เลื่อนย้อนหลัง 1 เดือน หรือเลื่อนไปข้างหน้า 1 ปี
NEXTMONTH คืนตารางวันที่ของเดือนถัดไปจากบริบทวันที่ปัจจุบัน มักใช้เป็นตารางตัวกรองใน CALCULATE เพื่อคำนวณค่าแบบ “เดือนถัดไป” ตามช่วงวันที่ที่ถูกเลือก/กรอง
OPENINGBALANCEMONTH ประเมิน Expression ณ จุดเปิดเดือน (วันสิ้นเดือนก่อนหน้า) เหมาะสำหรับหา opening balance ของยอดคงเหลือ สต็อก หรือสถิติ ณ จุดเริ่มเดือน
PARALLELPERIOD คืนตารางวันที่ที่ขนานกับช่วงเวลาปัจจุบัน แต่เลื่อนไปข้างหน้าหรือย้อนหลัง และขยายขอบเขตให้ครอบคลุมทั้งหน่วยเวลาที่ระบุ (MONTH/QUARTER/YEAR) เสมอ เหมาะกับการเทียบยอดรวมทั้งเดือน/ไตรมาส/ปี
PREVIOUSDAY คืนตารางวันที่ของวันก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับทำตัวชี้วัดแบบเทียบวันต่อวัน โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
PREVIOUSQUARTER คืนตารางวันที่ของไตรมาสก่อนหน้า ตามวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) โดยคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม ภายในใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER)
PREVIOUSWEEK คืนตารางวันที่ของสัปดาห์ก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับตัวชี้วัดแบบ Week-over-Week โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
PREVIOUSYEAR คืนตารางวันที่ของปีก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับตัวชี้วัดแบบ Year-over-Year โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
SAMEPERIODLASTYEAR คืน table ของวันที่ที่เลื่อนย้อนกลับไป 1 ปีจากช่วงวันที่ใน filter context ปัจจุบัน ใช้สำหรับการเปรียบเทียบ Year-over-Year (YoY) โดยต้องการ date table ที่ครบถ้วนต่อเนื่องและควร mark เป็น date table ในโมเดล
.
มักใช้ร่วมกับ CALCULATE เพื่อคำนวณค่าของปีก่อนหน้าในช่วงเดียวกัน ทำให้ได้ผลลัพธ์แบบ apples-to-apples comparison ที่แม่นยำโดยไม่ต้อง hard-code ช่วงวันที่ เหมาะสำหรับ measures และ calculated columns แต่ไม่รองรับ DirectQuery mode และไม่แนะนำสำหรับ visual calculations
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
อีเมลของคุณจะไม่ถูกเผยแพร่