PREVIOUSQUARTER คืนตารางวันที่ของไตรมาสก่อนหน้า ตามวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) โดยคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม ภายในใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER)
=PREVIOUSQUARTER(<dates>)
=PREVIOUSQUARTER(<dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| dates | column | Yes | คอลัมน์วันที่ (Date) ที่มาจากตารางวันที่/ปฏิทิน ต้องเป็นตารางที่มีวันที่ครบถ้วนต่อเนื่อง และ mark เป็น Date Table แล้ว |
สร้าง Measure แสดงยอดขายของไตรมาสก่อนหน้า เพื่อใช้เปรียบเทียบกับไตรมาสปัจจุบัน
คำนวณอัตราการเติบโตแบบ Quarter-over-Quarter เป็นเปอร์เซ็นต์
ใช้กับ Measure ต่างๆ เช่น กำไร ต้นทุน จำนวนลูกค้า เพื่อดูแนวโน้มรายไตรมาส
ซ่อนค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง เพื่อไม่ให้ผู้ใช้สับสน
Sales Previous Quarter = CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) )Sales Previous Quarter =
CALCULATE(
[Sales Amount],
PREVIOUSQUARTER('Date'[Date])
)
คืนยอดขายของไตรมาสก่อนหน้า เช่น ถ้าปัจจุบันคือ Q2 จะคืนยอดขายของ Q1
-- Step 1: สร้าง ShowValueForDates Measure (ซ่อนไว้) ShowValueForDates = VAR LastDateWithData = CALCULATE( MAX(Sales[OrderDate]), REMOVEFILTERS() ) VAR FirstDat…=-- 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
-- Step 1: ยอดขายไตรมาสก่อนหน้า Sales PQ = IF( [ShowValueForDates], CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) ) -- Step 2: ผลต่างไตรมาส Sales Q…-- 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%
-- วิธีที่ 1: PREVIOUSQUARTER (คืนทั้งไตรมาส) Sales PQ Method1 = CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) -- วิธีที่ 2: DATEADD (shift ตาม gra…=-- วิธีที่ 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 คืนยอดขายเดือน ก.พ. เท่านั้น
-- ไตรมาสเดียวกันปีก่อน (เช่น Q2 2024 vs Q2 2023) Sales SQLY = IF( [ShowValueForDates], CALCULATE( [Sales Amount], SAMEPERIODLASTYEAR('Date'[Date]) ) ) -- เปรีย…=-- ไตรมาสเดียวกันปีก่อน (เช่น 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%
Sales PQ with Drill = IF( [ShowValueForDates] && HASONEVALUE('Date'[Year Quarter]), CALCULATE( [Sales Amount], PREVIOUSQUARTER('Date'[Date]) ) )Sales PQ with Drill =
IF(
[ShowValueForDates] && HASONEVALUE('Date'[Year Quarter]),
CALCULATE(
[Sales Amount],
PREVIOUSQUARTER('Date'[Date])
)
)
แสดงค่าเฉพาะเมื่อเลือกไตรมาสเดียว ถ้าเลือกหลายไตรมาสหรือทั้งปีจะคืน BLANK
PREVIOUSQUARTER คืนทั้งไตรมาสก่อนหน้าเสมอ ไม่ว่าจะเลือกวันที่ใด (ใช้ PARALLELPERIOD + FIRSTDATE ภายใน) ส่วน DATEADD shift วันที่ตามช่วงที่เลือก เช่น ถ้าเลือกเดือน พ.ค. PREVIOUSQUARTER คืน Q1 ทั้งหมด แต่ DATEADD คืนเฉพาะ ก.พ. เลือกตามความต้องการ: เทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER, shift แบบรักษา granularity ใช้ DATEADD ครับ
ถ้าไม่ใช้ เมื่อผู้ใช้เลือกช่วงเวลาในอนาคต (ที่ยังไม่มีข้อมูล) Measure จะแสดงค่าของไตรมาสก่อนหน้าซึ่งอาจทำให้สับสน เช่น เลือก Q3 2024 (ยังไม่มีข้อมูล) แต่แสดงยอดขาย Q2 ShowValueForDates ช่วยให้คืน BLANK ในกรณีนี้ครับ 😅
ขึ้นอยู่กับตารางวันที่ของคุณ ถ้าเป็น 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 ต้องการคืนไตรมาสเดียวเท่านั้น ไม่ว่าผู้ใช้จะเลือกช่วงวันที่ยาวแค่ไหน ภายในจึงใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ซึ่งหมายความว่าถ้าเลือกหลายไตรมาส จะได้เฉพาะไตรมาสก่อนหน้าของวันที่แรกเท่านั้น ควรใช้ HASONEVALUE ร่วมด้วยเพื่อป้องกันความสับสนครับ 💡
รองรับใน Measures และ Calculated Tables แต่ไม่รองรับใน Calculated Columns หรือ Row-Level Security (RLS) rules เมื่อใช้ DirectQuery mode ถ้าต้องการใช้ใน RLS ให้พิจารณาใช้ DATEADD แทนครับ
PREVIOUSQUARTER เป็นฟังก์ชัน Time Intelligence ที่คืน “ตารางของวันที่” สำหรับไตรมาสก่อนหน้า โดยอ้างอิงจากวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) เช่น ยอดขายไตรมาสก่อนหน้า หรือคำนวณ % Growth รายไตรมาส
ที่เจ๋งคือ PREVIOUSQUARTER จะคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม เช่น ถ้าเลือกวันที่ 15 มิถุนายน จะได้วันที่ทั้งหมดของ Q1 (ม.ค.-มี.ค.) ซึ่งแตกต่างจาก DATEADD ที่จะ shift วันที่ตามช่วงที่เลือก
ส่วนตัวผมแนะนำให้ใช้ร่วมกับ ShowValueForDates Pattern เพื่อไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง เพราะถ้าไม่ใส่ อาจทำให้ผู้ใช้สับสนได้ครับ 😎
PREVIOUSQUARTER ใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ภายใน ซึ่งหมายความว่าจะคืนไตรมาสก่อนหน้าครบถ้วนเสมอ ส่วน DATEADD(-1, QUARTER) จะ shift วันที่ตามช่วงที่เลือก เช่น ถ้าเลือกเดือนมิถุนายน DATEADD จะคืนเดือนมีนาคม แต่ PREVIOUSQUARTER จะคืนทั้ง Q1 (ม.ค.-มี.ค.)
เลือกใช้ตามความเหมาะสม: ต้องการเทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER ต้องการ shift แบบรักษา granularity ใช้ DATEADD 💡
ShowValueForDates เป็น Pattern จาก DAXPatterns.com ที่ช่วยไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง โดยเช็คว่าวันที่แรกที่เลือกอยู่ไม่เกินวันที่มีข้อมูลล่าสุดหรือไม่
ShowValueForDates =
VAR LastDateWithData =
CALCULATE(
MAX(Sales[OrderDate]),
REMOVEFILTERS()
)
VAR FirstDateVisible =
MIN('Date'[Date])
RETURN
FirstDateVisible <= LastDateWithData
Pattern นี้สำคัญมากเพราะถ้าผู้ใช้เลือกช่วงเวลาในอนาคต Measure จะไม่แสดงค่าของไตรมาสก่อนหน้าซึ่งอาจทำให้เข้าใจผิดได้
การคำนวณ 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 ครับ