Thep Excel

PREVIOUSMONTH – ตารางวันที่ของเดือนก่อนหน้า

PREVIOUSMONTH คืนตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทปัจจุบัน เหมาะกับการทำ Measure เปรียบเทียบ Month-over-Month เช่น ยอดขายเดือนก่อนหน้า ข้อแตกต่างสำคัญกับ DATEADD คือ PREVIOUSMONTH คืนทั้งเดือนเสมอ ไม่ว่าจะเลือกวันไหนก็ตาม

=PREVIOUSMONTH(<dates>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
6/10

Difficulty
3/10

Usefulness
6/10

Syntax & Arguments

=PREVIOUSMONTH(<dates>)

Argument Type Required Default Description
dates column Yes คอลัมน์วันที่จากตาราง Date ต้องเป็น DateTime หรือ Date ที่มีค่า Unique และครอบคลุมทั้งปี (1 ม.ค. – 31 ธ.ค.)

How it works

ยอดขายเดือนก่อนหน้า (Month-over-Month)

ทำ Measure เปรียบเทียบยอดขายเดือนปัจจุบันกับเดือนก่อนหน้า สำหรับ Dashboard ที่แสดง Trend

คำนวณ % Growth เทียบเดือนก่อน

คำนวณ % การเติบโต (Growth Rate) เทียบกับเดือนก่อนหน้า เช่น ยอดขายโตขึ้น 15% จากเดือนก่อน

KPI Dashboard รายเดือน

แสดง KPI หลายตัวพร้อมกันโดยเปรียบเทียบกับเดือนก่อนหน้า เช่น ยอดขาย, จำนวนออเดอร์, จำนวนลูกค้า

Examples

ตัวอย่างที่ 1: ยอดขายเดือนก่อนหน้า (พื้นฐาน)
Sales Previous Month = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) )
PREVIOUSMONTH('Date'[Date]) คืนตารางวันที่ 1-31 กรกฎาคม 2024 แล้ว CALCULATE ใช้ตารางนี้เป็น Filter Context ในการคำนวณ [Sales Amount]
DAX Formula:

Sales Previous Month =
CALCULATE(
    [Sales Amount],
    PREVIOUSMONTH('Date'[Date])
)

Result:

ถ้าบริบทปัจจุบันคือเดือนสิงหาคม 2024 จะได้ยอดขายของกรกฎาคม 2024 ทั้งเดือน

ตัวอย่างที่ 2: ใช้ ShowValueForDates Pattern
-- Measure ช่วย: ตรวจสอบว่ามีข้อมูลจริงหรือยัง ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX( Sales[OrderDate] ), REMOVEFILTERS() ) VAR FirstDateVis…
Pattern นี้จาก DAXPatterns.com ป้องกัน Dashboard แสดงค่าศูนย์สำหรับเดือนที่ยังไม่มียอดขาย ทำให้ Trend Line ไม่ตกลงไปที่ศูนย์กลางเดือน
DAX Formula:

-- 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] ) )
)

Result:

ถ้าวันที่เลือกอยู่ในอนาคต (ยังไม่มีข้อมูล) จะแสดง BLANK แทนที่จะแสดง 0

ตัวอย่างที่ 3: Month-over-Month Growth (VAR…RETURN)
Sales MoM Growth = VAR CurrentMonth = [Sales Amount] VAR PreviousMonth = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) VAR Growth = CurrentMonth - Pr…
ใช้ VAR เก็บค่าแต่ละเดือน แล้วคำนวณผลต่าง IF ช่วยป้องกันไม่ให้แสดงค่าเมื่อเดือนใดเดือนหนึ่งไม่มีข้อมูล
DAX Formula:

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
    )

Result:

สมมติยอดขายสิงหาคม = 150,000 และกรกฎาคม = 120,000 ได้ผลลัพธ์ = 30,000

ตัวอย่างที่ 4: % Growth เดือนต่อเดือน
Sales MoM % = VAR CurrentMonth = [Sales Amount] VAR PreviousMonth = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) RETURN IF( NOT ISBLANK(CurrentMonth…
DIVIDE ช่วยป้องกัน Error กรณีหารด้วยศูนย์ ผลลัพธ์ 0.25 หมายถึงยอดขายเพิ่มขึ้น 25% จากเดือนก่อน
DAX Formula:

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)
    )

Result:

สมมติยอดขายสิงหาคม = 150,000 และกรกฎาคม = 120,000 ได้ผลลัพธ์ = 0.25 (25%)

ตัวอย่างที่ 5: เปรียบเทียบ PREVIOUSMONTH vs DATEADD
-- PREVIOUSMONTH: คืนทั้งเดือนก่อนหน้า Sales PM Full Month = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) -- DATEADD: เลื่อนวันถอยหลัง 1 เดือน (รักษ…
ความแตกต่างนี้สำคัญมาก PREVIOUSMONTH เหมาะเมื่อต้องการเปรียบเทียบทั้งเดือน ส่วน DATEADD เหมาะสำหรับ Month-to-Date หรือเปรียบเทียบช่วงวันที่เดียวกัน
DAX Formula:

-- 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)
)

Result:

ถ้าเลือกวันที่ 1-15 สิงหาคม:
- PREVIOUSMONTH ได้: 1-31 กรกฎาคม (ทั้งเดือน)
- DATEADD ได้: 1-15 กรกฎาคม (เฉพาะ 15 วันแรก)

ตัวอย่างที่ 6: ใช้ DateWithSales Pattern (Advanced)
-- Calculated Column ในตาราง Date DateWithSales = 'Date'[Date]
Pattern จาก DAXPatterns.com สำหรับกรณีที่เดือนปัจจุบันยังไม่จบ (เช่น วันที่ 15 ของเดือน) และต้องการเปรียบเทียบกับ 15 วันแรกของเดือนก่อนอย่างยุติธรรม
DAX Formula:

-- 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
        )
    )
)

Result:

เปรียบเทียบได้แม่นยำสำหรับ Incomplete Period

FAQs

ทำไมบางเดือนผลลัพธ์เป็น BLANK?

มักเกิดจาก 2 สาเหตุครับ: (1) ไม่มีข้อมูลของเดือนก่อนหน้าในตาราง Date เช่น ถ้าข้อมูลเริ่มที่มกราคม 2024 แล้วเลือกเดือนมกราคม จะไม่มีธันวาคม 2023 (2) บริบทวันที่ไม่ชัดเจน เช่น เลือกหลายเดือนปนกัน ทำให้ไม่รู้ว่าเดือนก่อนหน้าคือเดือนไหน

PREVIOUSMONTH กับ DATEADD(-1, MONTH) ต่างกันอย่างไร?

ต่างกันมากครับ! PREVIOUSMONTH คืน “ทั้งเดือน” ก่อนหน้าเสมอ ไม่ว่าบริบทปัจจุบันจะเลือกกี่วันก็ตาม ส่วน DATEADD เลื่อนแต่ละวันถอยหลัง 1 เดือน ถ้าเลือก 10 วัน ก็จะได้ 10 วันของเดือนก่อน ใช้ PREVIOUSMONTH เมื่อต้องการเปรียบเทียบ “เดือนต่อเดือน” ใช้ DATEADD เมื่อต้องการเปรียบเทียบ “ช่วงวันที่เดียวกัน”

ต้องใช้ตาราง Date แยกหรือเปล่า?

ควรมากครับ เพราะ Time Intelligence Functions ต้องการตาราง Date ที่ (1) มีวันที่ครบทุกวันตลอดทั้งปี (2) ไม่มีวันซ้ำ (3) ถูก Mark เป็น Date Table ใน Data Model ถ้าใช้คอลัมน์วันที่จาก Fact Table โดยตรง อาจมีวันที่ขาดหายและทำให้ผลลัพธ์ผิดพลาด

ShowValueForDates Pattern คืออะไร ทำไมต้องใช้?

เป็น Pattern จาก DAXPatterns.com สำหรับซ่อนค่าของวันที่ในอนาคต ถ้าไม่ใช้ Dashboard อาจแสดงค่า 0 หรือ BLANK สำหรับเดือนที่ยังไม่มีข้อมูล ทำให้ Trend Line ตกลงไปที่ศูนย์กลางเดือน ดูไม่สวยและเข้าใจผิดได้

ใช้ PREVIOUSMONTH ซ้อนกันได้ไหม เช่น 2 เดือนก่อน?

ได้ครับ เช่น PREVIOUSMONTH(PREVIOUSMONTH(‘Date'[Date])) แต่ไม่แนะนำเพราะอ่านยากและช้ากว่า ถ้าต้องการถอยหลังหลายเดือน แนะนำใช้ DATEADD(‘Date'[Date], -2, MONTH) หรือ PARALLELPERIOD แทนครับ

Resources & Related

Additional Notes

PREVIOUSMONTH เป็น Time Intelligence Function ที่คืนค่า ตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทวันที่ปัจจุบัน

.

ที่เจ๋งคือ PREVIOUSMONTH ใช้งานง่ายมาก แค่ใส่คอลัมน์วันที่เข้าไปก็ได้ผลลัพธ์เลย แต่ที่ต้องเข้าใจคือมันคืน ทั้งเดือน เสมอ ไม่ว่าบริบทปัจจุบันจะเลือกวันไหนก็ตาม

.

PREVIOUSMONTH vs DATEADD – ความแตกต่างที่ต้องรู้

PREVIOUSMONTH: คืน ทั้งเดือน ก่อนหน้า เสมอ (ถ้าเลือก 15-20 สิงหาคม จะได้ 1-31 กรกฎาคม)

DATEADD(-1, MONTH): เลื่อน แต่ละวัน ถอยหลัง 1 เดือน (ถ้าเลือก 15-20 สิงหาคม จะได้ 15-20 กรกฎาคม)

.

ส่วนตัวผมแนะนำให้ใช้ PREVIOUSMONTH เมื่อต้องการเปรียบเทียบ “ทั้งเดือน” กับ “ทั้งเดือน” แต่ถ้าต้องการ Month-to-Date หรือเปรียบเทียบวันต่อวัน ให้ใช้ DATEADD แทนครับ

.

ShowValueForDates Pattern – จัดการวันที่ในอนาคต

เวลาทำ 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] ) )
)

Leave a Reply

Your email address will not be published. Required fields are marked *