Thep Excel

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

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

fx
=PREVIOUSMONTH(<dates>)

ความนิยม6/10
ความยาก3/10
ประโยชน์6/10

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
dates column คอลัมน์วันที่จากตาราง Date ต้องเป็น DateTime หรือ Date ที่มีค่า Unique และครอบคลุมทั้งปี (1 ม.ค. – 31 ธ.ค.)

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

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]

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

ผลลัพธ์ถ้าบริบทปัจจุบันคือเดือนสิงหาคม 2024 จะได้ยอดขายของกรกฎาคม 2024 ทั้งเดือน
ตัวอย่างที่ 2: ใช้ ShowValueForDates Pattern— Measure ช่วย: ตรวจสอบว่ามีข้อมูลจริงหรือยัง ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX( Sales[OrderDate] ), REMOVEFILTERS() ) VAR FirstDateVis…

Pattern นี้จาก DAXPatterns.com ป้องกัน Dashboard แสดงค่าศูนย์สำหรับเดือนที่ยังไม่มียอดขาย ทำให้ Trend Line ไม่ตกลงไปที่ศูนย์กลางเดือน

fx
— 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
ตัวอย่างที่ 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 ช่วยป้องกันไม่ให้แสดงค่าเมื่อเดือนใดเดือนหนึ่งไม่มีข้อมูล

fx
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
ตัวอย่างที่ 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% จากเดือนก่อน

fx
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%)
ตัวอย่างที่ 5: เปรียบเทียบ PREVIOUSMONTH vs DATEADD— PREVIOUSMONTH: คืนทั้งเดือนก่อนหน้า Sales PM Full Month = CALCULATE( [Sales Amount], PREVIOUSMONTH('Date'[Date]) ) — DATEADD: เลื่อนวันถอยหลัง 1 เดือน (รักษ…

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

fx
— 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 วันแรก)
ตัวอย่างที่ 6: ใช้ DateWithSales Pattern (Advanced)— Calculated Column ในตาราง Date DateWithSales = 'Date'[Date]

Pattern จาก DAXPatterns.com สำหรับกรณีที่เดือนปัจจุบันยังไม่จบ (เช่น วันที่ 15 ของเดือน) และต้องการเปรียบเทียบกับ 15 วันแรกของเดือนก่อนอย่างยุติธรรม

fx
— 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

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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ PREVIOUSMONTH จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้PREVIOUSMONTHTime Intelligence
Time Intelligence (9)
DATEADD

DATEADD คืนค่าตารางวันที่ ที่ถูกเลื่อนออกไปจากช่วงวันที่ใน Context ปัจจุบัน ตามจำนวน (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น เลื่อนย้อนหลัง 1 เดือน หรือเลื่อนไปข้างหน้า 1 ปี

NEXTMONTH

NEXTMONTH คืนตารางวันที่ของเดือนถัดไปจากบริบทวันที่ปัจจุบัน มักใช้เป็นตารางตัวกรองใน CALCULATE เพื่อคำนวณค่าแบบ “เดือนถัดไป” ตามช่วงวันที่ที่ถูกเลือก/กรอง

OPENINGBALANCEMONTH

OPENINGBALANCEMONTH ประเมิน Expression ณ จุดเปิดเดือน (วันสิ้นเดือนก่อนหน้า) เหมาะสำหรับหา opening balance ของยอดคงเหลือ สต็อก หรือสถิติ ณ จุดเริ่มเดือน

PARALLELPERIOD

PARALLELPERIOD คืนตารางวันที่ที่ขนานกับช่วงเวลาปัจจุบัน แต่เลื่อนไปข้างหน้าหรือย้อนหลัง และขยายขอบเขตให้ครอบคลุมทั้งหน่วยเวลาที่ระบุ (MONTH/QUARTER/YEAR) เสมอ เหมาะกับการเทียบยอดรวมทั้งเดือน/ไตรมาส/ปี

PREVIOUSDAY

PREVIOUSDAY คืนตารางวันที่ของวันก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับทำตัวชี้วัดแบบเทียบวันต่อวัน โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา

PREVIOUSQUARTER

PREVIOUSQUARTER คืนตารางวันที่ของไตรมาสก่อนหน้า ตามวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) โดยคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม ภายในใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER)

PREVIOUSWEEK

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

PREVIOUSYEAR

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

SAMEPERIODLASTYEAR

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

Filter (1)
CALCULATE

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

อีเมลของคุณจะไม่ถูกเผยแพร่