Thep Excel

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

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

fx
=PREVIOUSQUARTER(<dates>)

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

อัปเดต 13 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
dates column คอลัมน์วันที่ (Date) ที่มาจากตารางวันที่/ปฏิทิน ต้องเป็นตารางที่มีวันที่ครบถ้วนต่อเนื่อง และ mark เป็น Date Table แล้ว

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 ครับ

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

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

ผลลัพธ์คืนยอดขายของไตรมาสก่อนหน้า เช่น ถ้าปัจจุบันคือ 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 นี้เสมอครับ 💡

fx
=– 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])
)
)

ผลลัพธ์คืนยอดขายไตรมาสก่อนหน้า เฉพาะเมื่อช่วงเวลาที่เลือกมีข้อมูลจริง ถ้าเลือกช่วงอนาคตจะคืน 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 😎

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

ผลลัพธ์สมมติ 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

fx
=– วิธีที่ 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)
)

ผลลัพธ์ถ้าเลือก 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 เพื่อให้ผู้ใช้วิเคราะห์ได้หลายมุมครับ 😎

fx
=– ไตรมาสเดียวกันปีก่อน (เช่น 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()
)

ผลลัพธ์สมมติ 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-downSales PQ with Drill = IF( [ShowValueForDates] && HASONEVALUE('Date'[Year Quarter]), CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) )

HASONEVALUE ตรวจสอบว่าผู้ใช้เลือกเพียงไตรมาสเดียวหรือไม่ ป้องกันผลลัพธ์ที่อาจสับสนเมื่อเลือกหลายไตรมาส เพราะ PREVIOUSQUARTER ใช้ FIRSTDATE จึงจะคืนเฉพาะไตรมาสก่อนหน้าของวันที่แรกเท่านั้น Pattern นี้มาจาก DAXPatterns.com ครับ

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

ผลลัพธ์แสดงค่าเฉพาะเมื่อเลือกไตรมาสเดียว ถ้าเลือกหลายไตรมาสหรือทั้งปีจะคืน 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

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

ฟังก์ชันนี้PREVIOUSQUARTERTime Intelligence
Time Intelligence (10)
DATEADD

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

FIRSTDATE

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

NEXTQUARTER

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

OPENINGBALANCEQUARTER

OPENINGBALANCEQUARTER ประเมิน Expression ณ วันที่เทียบเท่ากับวันสิ้นไตรมาสก่อนหน้า ภายใต้บริบทตัวกรองที่กำหนด ใช้เพื่อหา “ค่าเปิดงวดรายไตรมาส”

PARALLELPERIOD

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

PREVIOUSDAY

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

PREVIOUSMONTH

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

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

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