Thep Excel

PREVIOUSQUARTER – ตารางวันที่ของไตรมาสก่อนหน้า

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

=PREVIOUSQUARTER(<dates>)

By ThepExcel AI Agent
13 December 2025

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

=PREVIOUSQUARTER(<dates>)

Argument Type Required Default Description
dates column Yes คอลัมน์วันที่ (Date) ที่มาจากตารางวันที่/ปฏิทิน ต้องเป็นตารางที่มีวันที่ครบถ้วนต่อเนื่อง และ mark เป็น Date Table แล้ว

How it works

ยอดขายไตรมาสก่อนหน้า (Sales PQ)

สร้าง Measure แสดงยอดขายของไตรมาสก่อนหน้า เพื่อใช้เปรียบเทียบกับไตรมาสปัจจุบัน

คำนวณ QoQ Growth %

คำนวณอัตราการเติบโตแบบ Quarter-over-Quarter เป็นเปอร์เซ็นต์

เปรียบเทียบ KPI รายไตรมาส

ใช้กับ Measure ต่างๆ เช่น กำไร ต้นทุน จำนวนลูกค้า เพื่อดูแนวโน้มรายไตรมาส

ใช้ร่วมกับ ShowValueForDates Pattern

ซ่อนค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง เพื่อไม่ให้ผู้ใช้สับสน

Examples

ตัวอย่างที่ 1: ยอดขายไตรมาสก่อนหน้า (พื้นฐาน)
Sales Previous Quarter = CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) )
PREVIOUSQUARTER คืนชุดวันที่ของไตรมาสก่อนหน้า แล้วนำไปเป็นตัวกรองเวลาใน CALCULATE สมมติตาราง Sales มีข้อมูลยอดขาย Q1 = 500,000 และ Q2 = 650,000 ถ้าเลือก Q2 Measure นี้จะคืนค่า 500,000
DAX Formula:

Sales Previous Quarter =
CALCULATE(
    [Sales Amount],
    PREVIOUSQUARTER('Date'[Date])
)

Result:

คืนยอดขายของไตรมาสก่อนหน้า เช่น ถ้าปัจจุบันคือ Q2 จะคืนยอดขายของ Q1

ตัวอย่างที่ 2: ใช้ ShowValueForDates Pattern (แนะนำ)
-- Step 1: สร้าง ShowValueForDates Measure (ซ่อนไว้) ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX(Sales[OrderDate]), REMOVEFILTERS() ) VAR FirstDat…
ShowValueForDates Pattern จาก DAXPatterns.com ช่วยไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูล เช่น ถ้าข้อมูลล่าสุดคือ 15 มิ.ย. 2024 แต่ผู้ใช้เลือก Q3 2024 Measure นี้จะคืน BLANK แทนที่จะแสดงค่า Q2 ซึ่งอาจทำให้สับสน ส่วนตัวผมแนะนำให้ใช้ Pattern นี้เสมอครับ 💡
DAX Formula:

=-- Step 1: สร้าง ShowValueForDates Measure (ซ่อนไว้)
ShowValueForDates =
VAR LastDateWithData =
    CALCULATE(
        MAX(Sales[OrderDate]),
        REMOVEFILTERS()
    )
VAR FirstDateVisible =
    MIN('Date'[Date])
VAR Result =
    FirstDateVisible <= LastDateWithData
RETURN
    Result

-- Step 2: ใช้ใน Measure หลัก
Sales PQ =
IF(
    [ShowValueForDates],
    CALCULATE(
        [Sales Amount],
        PREVIOUSQUARTER('Date'[Date])
    )
)

Result:

คืนยอดขายไตรมาสก่อนหน้า เฉพาะเมื่อช่วงเวลาที่เลือกมีข้อมูลจริง ถ้าเลือกช่วงอนาคตจะคืน BLANK

ตัวอย่างที่ 3: คำนวณ QoQ Growth %
-- Step 1: ยอดขายไตรมาสก่อนหน้า Sales PQ = IF( [ShowValueForDates], CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) ) -- Step 2: ผลต่างไตรมาส Sales Q…
Pattern มาตรฐานสำหรับคำนวณ Quarter-over-Quarter Growth ใช้ DIVIDE เพื่อจัดการกรณีหารด้วยศูนย์ ถ้า Q1 เป็น BLANK จะคืน BLANK แทน Error ที่เจ๋งคือ Pattern นี้ใช้ได้กับทุก Measure ไม่ว่าจะเป็น Revenue, Profit, หรือ Customer Count 😎
DAX Formula:

-- Step 1: ยอดขายไตรมาสก่อนหน้า
Sales PQ =
IF(
    [ShowValueForDates],
    CALCULATE(
        [Sales Amount],
        PREVIOUSQUARTER('Date'[Date])
    )
)

-- Step 2: ผลต่างไตรมาส
Sales QOQ =
VAR CurrentQtr = [Sales Amount]
VAR PrevQtr = [Sales PQ]
RETURN
    CurrentQtr - PrevQtr

-- Step 3: เปอร์เซ็นต์การเติบโต
Sales QOQ % =
DIVIDE(
    [Sales QOQ],
    [Sales PQ],
    BLANK()
)

Result:

สมมติ Q1 = 500,000 และ Q2 = 650,000 จะได้ QoQ = 150,000 และ QoQ % = 30%

ตัวอย่างที่ 4: เปรียบเทียบ PREVIOUSQUARTER vs DATEADD
-- วิธีที่ 1: PREVIOUSQUARTER (คืนทั้งไตรมาส) Sales PQ Method1 = CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) -- วิธีที่ 2: DATEADD (shift ตาม gra…
PREVIOUSQUARTER ใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ภายใน จึงคืนทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใด ส่วน DATEADD จะ shift วันที่ตามช่วงที่เลือก เลือกใช้ตามความเหมาะสม: ต้องการเทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER ต้องการ shift แบบรักษา granularity ใช้ DATEADD
DAX Formula:

=-- วิธีที่ 1: PREVIOUSQUARTER (คืนทั้งไตรมาส)
Sales PQ Method1 =
CALCULATE(
    [Sales Amount],
    PREVIOUSQUARTER('Date'[Date])
)

-- วิธีที่ 2: DATEADD (shift ตาม granularity)
Sales PQ Method2 =
CALCULATE(
    [Sales Amount],
    DATEADD('Date'[Date], -1, QUARTER)
)

Result:

ถ้าเลือก Q2 ทั้งหมด: ทั้งสองวิธีคืนค่าเท่ากัน (ยอดขาย Q1)
ถ้าเลือกเฉพาะเดือน พ.ค.: PREVIOUSQUARTER คืนยอดขาย Q1 ทั้งหมด แต่ DATEADD คืนยอดขายเดือน ก.พ. เท่านั้น

ตัวอย่างที่ 5: เปรียบเทียบไตรมาสเดียวกันปีก่อน (Same Quarter Last Year)
-- ไตรมาสเดียวกันปีก่อน (เช่น Q2 2024 vs Q2 2023) Sales SQLY = IF( [ShowValueForDates], CALCULATE( [Sales Amount], SAMEPERIODLASTYEAR('Date'[Date]) ) ) -- เปรีย…
SAMEPERIODLASTYEAR คืนช่วงเวลาเดียวกันของปีก่อน (ภายในใช้ DATEADD -1 YEAR) ใช้สำหรับเปรียบเทียบ Seasonality เช่น Q4 มักขายดีเพราะ Holiday Season ส่วน PREVIOUSQUARTER ใช้เปรียบเทียบ Sequential ดูแนวโน้มต่อเนื่อง ส่วนตัวผมแนะนำให้สร้างทั้งสอง Measure เพื่อให้ผู้ใช้วิเคราะห์ได้หลายมุมครับ 😎
DAX Formula:

=-- ไตรมาสเดียวกันปีก่อน (เช่น Q2 2024 vs Q2 2023)
Sales SQLY =
IF(
    [ShowValueForDates],
    CALCULATE(
        [Sales Amount],
        SAMEPERIODLASTYEAR('Date'[Date])
    )
)

-- เปรียบเทียบกับไตรมาสก่อนหน้า (Q2 2024 vs Q1 2024)
Sales PQ =
IF(
    [ShowValueForDates],
    CALCULATE(
        [Sales Amount],
        PREVIOUSQUARTER('Date'[Date])
    )
)

-- YoY Growth % (เทียบปีต่อปี)
Sales YoY % =
DIVIDE(
    [Sales Amount] - [Sales SQLY],
    [Sales SQLY],
    BLANK()
)

Result:

สมมติ Q2 2023 = 400,000, Q1 2024 = 500,000, Q2 2024 = 650,000
SQPY = 400,000 (Q2 ปีก่อน), PQ = 500,000 (Q1 ปีนี้), YoY % = 62.5%

ตัวอย่างที่ 6: ใช้กับ HASONEVALUE สำหรับ Drill-down
Sales PQ with Drill = IF( [ShowValueForDates] && HASONEVALUE('Date'[Year Quarter]), CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) )
HASONEVALUE ตรวจสอบว่าผู้ใช้เลือกเพียงไตรมาสเดียวหรือไม่ ป้องกันผลลัพธ์ที่อาจสับสนเมื่อเลือกหลายไตรมาส เพราะ PREVIOUSQUARTER ใช้ FIRSTDATE จึงจะคืนเฉพาะไตรมาสก่อนหน้าของวันที่แรกเท่านั้น Pattern นี้มาจาก DAXPatterns.com ครับ
DAX Formula:

Sales PQ with Drill =
IF(
    [ShowValueForDates] && HASONEVALUE('Date'[Year Quarter]),
    CALCULATE(
        [Sales Amount],
        PREVIOUSQUARTER('Date'[Date])
    )
)

Result:

แสดงค่าเฉพาะเมื่อเลือกไตรมาสเดียว ถ้าเลือกหลายไตรมาสหรือทั้งปีจะคืน BLANK

FAQs

PREVIOUSQUARTER ต่างจาก DATEADD(-1, QUARTER) อย่างไร?

PREVIOUSQUARTER คืนทั้งไตรมาสก่อนหน้าเสมอ ไม่ว่าจะเลือกวันที่ใด (ใช้ PARALLELPERIOD + FIRSTDATE ภายใน) ส่วน DATEADD shift วันที่ตามช่วงที่เลือก เช่น ถ้าเลือกเดือน พ.ค. PREVIOUSQUARTER คืน Q1 ทั้งหมด แต่ DATEADD คืนเฉพาะ ก.พ. เลือกตามความต้องการ: เทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER, shift แบบรักษา granularity ใช้ DATEADD ครับ

ทำไมถึงต้องใช้ ShowValueForDates Pattern?

ถ้าไม่ใช้ เมื่อผู้ใช้เลือกช่วงเวลาในอนาคต (ที่ยังไม่มีข้อมูล) Measure จะแสดงค่าของไตรมาสก่อนหน้าซึ่งอาจทำให้สับสน เช่น เลือก Q3 2024 (ยังไม่มีข้อมูล) แต่แสดงยอดขาย Q2 ShowValueForDates ช่วยให้คืน BLANK ในกรณีนี้ครับ 😅

ไตรมาสของ PREVIOUSQUARTER อิงตามปฏิทินแบบไหน?

ขึ้นอยู่กับตารางวันที่ของคุณ ถ้าเป็น Standard Calendar ไตรมาสจะเป็น Q1=ม.ค.-มี.ค., Q2=เม.ย.-มิ.ย., Q3=ก.ค.-ก.ย., Q4=ต.ค.-ธ.ค. สำหรับ Fiscal Year สามารถใช้ Calendar reference ใน Power BI หรือสร้างตารางวันที่แบบ Custom ได้ครับ

ถ้าต้องการเทียบไตรมาสเดียวกันปีก่อน ใช้ฟังก์ชันอะไร?

ใช้ SAMEPERIODLASTYEAR ซึ่งภายในทำงานเหมือน DATEADD(-1, YEAR) เช่น Q2 2024 จะเทียบกับ Q2 2023 ซึ่งเหมาะสำหรับวิเคราะห์ Seasonality ส่วน PREVIOUSQUARTER เทียบแบบ Sequential (Q2 vs Q1) เหมาะสำหรับดูแนวโน้มต่อเนื่องครับ

ทำไม PREVIOUSQUARTER ถึงใช้ FIRSTDATE ภายใน?

เพราะ PREVIOUSQUARTER ต้องการคืนไตรมาสเดียวเท่านั้น ไม่ว่าผู้ใช้จะเลือกช่วงวันที่ยาวแค่ไหน ภายในจึงใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ซึ่งหมายความว่าถ้าเลือกหลายไตรมาส จะได้เฉพาะไตรมาสก่อนหน้าของวันที่แรกเท่านั้น ควรใช้ HASONEVALUE ร่วมด้วยเพื่อป้องกันความสับสนครับ 💡

PREVIOUSQUARTER รองรับ DirectQuery หรือไม่?

รองรับใน Measures และ Calculated Tables แต่ไม่รองรับใน Calculated Columns หรือ Row-Level Security (RLS) rules เมื่อใช้ DirectQuery mode ถ้าต้องการใช้ใน RLS ให้พิจารณาใช้ DATEADD แทนครับ

Resources & Related

Additional Notes

PREVIOUSQUARTER เป็นฟังก์ชัน Time Intelligence ที่คืน “ตารางของวันที่” สำหรับไตรมาสก่อนหน้า โดยอ้างอิงจากวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) เช่น ยอดขายไตรมาสก่อนหน้า หรือคำนวณ % Growth รายไตรมาส

ที่เจ๋งคือ PREVIOUSQUARTER จะคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม เช่น ถ้าเลือกวันที่ 15 มิถุนายน จะได้วันที่ทั้งหมดของ Q1 (ม.ค.-มี.ค.) ซึ่งแตกต่างจาก DATEADD ที่จะ shift วันที่ตามช่วงที่เลือก

ส่วนตัวผมแนะนำให้ใช้ร่วมกับ ShowValueForDates Pattern เพื่อไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง เพราะถ้าไม่ใส่ อาจทำให้ผู้ใช้สับสนได้ครับ 😎

PREVIOUSQUARTER vs DATEADD: ต่างกันอย่างไร?

PREVIOUSQUARTER ใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ภายใน ซึ่งหมายความว่าจะคืนไตรมาสก่อนหน้าครบถ้วนเสมอ ส่วน DATEADD(-1, QUARTER) จะ shift วันที่ตามช่วงที่เลือก เช่น ถ้าเลือกเดือนมิถุนายน DATEADD จะคืนเดือนมีนาคม แต่ PREVIOUSQUARTER จะคืนทั้ง Q1 (ม.ค.-มี.ค.)

เลือกใช้ตามความเหมาะสม: ต้องการเทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER ต้องการ shift แบบรักษา granularity ใช้ DATEADD 💡

ShowValueForDates Pattern คืออะไร?

ShowValueForDates เป็น Pattern จาก DAXPatterns.com ที่ช่วยไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง โดยเช็คว่าวันที่แรกที่เลือกอยู่ไม่เกินวันที่มีข้อมูลล่าสุดหรือไม่

ShowValueForDates =
VAR LastDateWithData =
    CALCULATE(
        MAX(Sales[OrderDate]),
        REMOVEFILTERS()
    )
VAR FirstDateVisible =
    MIN('Date'[Date])
RETURN
    FirstDateVisible <= LastDateWithData

Pattern นี้สำคัญมากเพราะถ้าผู้ใช้เลือกช่วงเวลาในอนาคต Measure จะไม่แสดงค่าของไตรมาสก่อนหน้าซึ่งอาจทำให้เข้าใจผิดได้

QoQ Growth: การคำนวณการเติบโตรายไตรมาส

การคำนวณ Quarter-over-Quarter Growth เป็นหนึ่งใน Use Case ที่พบบ่อยที่สุดของ PREVIOUSQUARTER โดยใช้สูตรมาตรฐานดังนี้:

-- ยอดขายไตรมาสก่อนหน้า
Sales PQ =
IF([ShowValueForDates],
    CALCULATE([Sales Amount], PREVIOUSQUARTER('Date'[Date]))
)

-- เปอร์เซ็นต์การเติบโต
Sales QOQ % =
DIVIDE(
    [Sales Amount] - [Sales PQ],
    [Sales PQ],
    BLANK()
)

ใช้ DIVIDE เพื่อจัดการกรณีที่ไตรมาสก่อนหน้าไม่มีข้อมูล (หารด้วย BLANK) จะได้ BLANK แทน Error ครับ

Leave a Reply

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