PREVIOUSMONTH คืนตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทปัจจุบัน เหมาะกับการทำ Measure เปรียบเทียบ Month-over-Month เช่น ยอดขายเดือนก่อนหน้า ข้อแตกต่างสำคัญกับ DATEADD คือ PREVIOUSMONTH คืนทั้งเดือนเสมอ ไม่ว่าจะเลือกวันไหนก็ตาม
=PREVIOUSMONTH(<dates>)
=PREVIOUSMONTH(<dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| dates | column | Yes | คอลัมน์วันที่จากตาราง Date ต้องเป็น DateTime หรือ Date ที่มีค่า Unique และครอบคลุมทั้งปี (1 ม.ค. – 31 ธ.ค.) |
ทำ Measure เปรียบเทียบยอดขายเดือนปัจจุบันกับเดือนก่อนหน้า สำหรับ Dashboard ที่แสดง Trend
คำนวณ % การเติบโต (Growth Rate) เทียบกับเดือนก่อนหน้า เช่น ยอดขายโตขึ้น 15% จากเดือนก่อน
แสดง KPI หลายตัวพร้อมกันโดยเปรียบเทียบกับเดือนก่อนหน้า เช่น ยอดขาย, จำนวนออเดอร์, จำนวนลูกค้า
Sales Previous Month = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) )Sales Previous Month =
CALCULATE(
[Sales Amount],
PREVIOUSMONTH('Date'[Date])
)
ถ้าบริบทปัจจุบันคือเดือนสิงหาคม 2024 จะได้ยอดขายของกรกฎาคม 2024 ทั้งเดือน
-- Measure ช่วย: ตรวจสอบว่ามีข้อมูลจริงหรือยัง ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX( Sales[OrderDate] ), REMOVEFILTERS() ) VAR FirstDateVis…-- Measure ช่วย: ตรวจสอบว่ามีข้อมูลจริงหรือยัง
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] ) )
)
ถ้าวันที่เลือกอยู่ในอนาคต (ยังไม่มีข้อมูล) จะแสดง BLANK แทนที่จะแสดง 0
Sales MoM Growth = VAR CurrentMonth = [Sales Amount] VAR PreviousMonth = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) VAR Growth = CurrentMonth - Pr…Sales MoM Growth =
VAR CurrentMonth = [Sales Amount]
VAR PreviousMonth =
CALCULATE(
[Sales Amount],
PREVIOUSMONTH('Date'[Date])
)
VAR Growth = CurrentMonth - PreviousMonth
RETURN
IF(
NOT ISBLANK(CurrentMonth) && NOT ISBLANK(PreviousMonth),
Growth
)
สมมติยอดขายสิงหาคม = 150,000 และกรกฎาคม = 120,000 ได้ผลลัพธ์ = 30,000
Sales MoM % = VAR CurrentMonth = [Sales Amount] VAR PreviousMonth = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) RETURN IF( NOT ISBLANK(CurrentMonth…Sales MoM % =
VAR CurrentMonth = [Sales Amount]
VAR PreviousMonth =
CALCULATE(
[Sales Amount],
PREVIOUSMONTH('Date'[Date])
)
RETURN
IF(
NOT ISBLANK(CurrentMonth) && NOT ISBLANK(PreviousMonth),
DIVIDE(CurrentMonth - PreviousMonth, PreviousMonth)
)
สมมติยอดขายสิงหาคม = 150,000 และกรกฎาคม = 120,000 ได้ผลลัพธ์ = 0.25 (25%)
-- PREVIOUSMONTH: คืนทั้งเดือนก่อนหน้า Sales PM Full Month = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) -- DATEADD: เลื่อนวันถอยหลัง 1 เดือน (รักษ…-- PREVIOUSMONTH: คืนทั้งเดือนก่อนหน้า
Sales PM Full Month =
CALCULATE(
[Sales Amount],
PREVIOUSMONTH('Date'[Date])
)
-- DATEADD: เลื่อนวันถอยหลัง 1 เดือน (รักษาช่วงวันที่)
Sales PM Same Days =
CALCULATE(
[Sales Amount],
DATEADD('Date'[Date], -1, MONTH)
)
ถ้าเลือกวันที่ 1-15 สิงหาคม:
- PREVIOUSMONTH ได้: 1-31 กรกฎาคม (ทั้งเดือน)
- DATEADD ได้: 1-15 กรกฎาคม (เฉพาะ 15 วันแรก)
-- Calculated Column ในตาราง Date DateWithSales = 'Date'[Date]-- Calculated Column ในตาราง Date
DateWithSales = 'Date'[Date] <= MAX( Sales[OrderDate] )
-- Measure: เปรียบเทียบเฉพาะวันที่มียอดขายจริง
Sales PM Comparable =
IF(
[ShowValueForDates],
CALCULATE(
[Sales Amount],
CALCULATETABLE(
PREVIOUSMONTH( 'Date'[Date] ),
'Date'[DateWithSales] = TRUE
)
)
)
เปรียบเทียบได้แม่นยำสำหรับ Incomplete Period
มักเกิดจาก 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 เป็น 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] ) )
)