PREVIOUSQUARTER คืนตารางวันที่ของไตรมาสก่อนหน้า ตามวันที่แรกในบริบทปัจจุบัน ใช้สำหรับสร้าง Measure เปรียบเทียบ Quarter-over-Quarter (QoQ) โดยคืนวันที่ครบทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใดก็ตาม ภายในใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER)
| อาร์กิวเมนต์ | ชนิด | คำอธิบาย |
|---|---|---|
| dates | column | คอลัมน์วันที่ (Date) ที่มาจากตารางวันที่/ปฏิทิน ต้องเป็นตารางที่มีวันที่ครบถ้วนต่อเนื่อง และ mark เป็น Date Table แล้ว |
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 ครับ
สร้าง Measure แสดงยอดขายของไตรมาสก่อนหน้า เพื่อใช้เปรียบเทียบกับไตรมาสปัจจุบัน
คำนวณอัตราการเติบโตแบบ Quarter-over-Quarter เป็นเปอร์เซ็นต์
ใช้กับ Measure ต่างๆ เช่น กำไร ต้นทุน จำนวนลูกค้า เพื่อดูแนวโน้มรายไตรมาส
ซ่อนค่าในช่วงเวลาที่ยังไม่มีข้อมูลจริง เพื่อไม่ให้ผู้ใช้สับสน
PREVIOUSQUARTER คืนชุดวันที่ของไตรมาสก่อนหน้า แล้วนำไปเป็นตัวกรองเวลาใน CALCULATE สมมติตาราง Sales มีข้อมูลยอดขาย Q1 = 500,000 และ Q2 = 650,000 ถ้าเลือก Q2 Measure นี้จะคืนค่า 500,000
ShowValueForDates Pattern จาก DAXPatterns.com ช่วยไม่ให้แสดงค่าในช่วงเวลาที่ยังไม่มีข้อมูล เช่น ถ้าข้อมูลล่าสุดคือ 15 มิ.ย. 2024 แต่ผู้ใช้เลือก Q3 2024 Measure นี้จะคืน BLANK แทนที่จะแสดงค่า Q2 ซึ่งอาจทำให้สับสน ส่วนตัวผมแนะนำให้ใช้ Pattern นี้เสมอครับ 💡
Pattern มาตรฐานสำหรับคำนวณ Quarter-over-Quarter Growth ใช้ DIVIDE เพื่อจัดการกรณีหารด้วยศูนย์ ถ้า Q1 เป็น BLANK จะคืน BLANK แทน Error ที่เจ๋งคือ Pattern นี้ใช้ได้กับทุก Measure ไม่ว่าจะเป็น Revenue, Profit, หรือ Customer Count 😎
PREVIOUSQUARTER ใช้ PARALLELPERIOD(FIRSTDATE(dates), -1, QUARTER) ภายใน จึงคืนทั้งไตรมาสเสมอ ไม่ว่าจะเลือกวันที่ใด ส่วน DATEADD จะ shift วันที่ตามช่วงที่เลือก เลือกใช้ตามความเหมาะสม: ต้องการเทียบทั้งไตรมาส ใช้ PREVIOUSQUARTER ต้องการ shift แบบรักษา granularity ใช้ DATEADD
SAMEPERIODLASTYEAR คืนช่วงเวลาเดียวกันของปีก่อน (ภายในใช้ DATEADD -1 YEAR) ใช้สำหรับเปรียบเทียบ Seasonality เช่น Q4 มักขายดีเพราะ Holiday Season ส่วน PREVIOUSQUARTER ใช้เปรียบเทียบ Sequential ดูแนวโน้มต่อเนื่อง ส่วนตัวผมแนะนำให้สร้างทั้งสอง Measure เพื่อให้ผู้ใช้วิเคราะห์ได้หลายมุมครับ 😎
HASONEVALUE ตรวจสอบว่าผู้ใช้เลือกเพียงไตรมาสเดียวหรือไม่ ป้องกันผลลัพธ์ที่อาจสับสนเมื่อเลือกหลายไตรมาส เพราะ PREVIOUSQUARTER ใช้ FIRSTDATE จึงจะคืนเฉพาะไตรมาสก่อนหน้าของวันที่แรกเท่านั้น Pattern นี้มาจาก DAXPatterns.com ครับ
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 จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
DATEADD คืนค่าตารางวันที่ ที่ถูกเลื่อนออกไปจากช่วงวันที่ใน Context ปัจจุบัน ตามจำนวน (NumberOfIntervals) และหน่วย (Interval) ที่กำหนด เช่น เลื่อนย้อนหลัง 1 เดือน หรือเลื่อนไปข้างหน้า 1 ปี
FIRSTDATE คืนค่าวันที่แรกในบริบทตัวกรองปัจจุบัน เหมาะใช้เป็นตัวกรองให้ CALCULATE เพื่อหายอดขาย/จำนวนของวันแรกในช่วงที่เลือก
NEXTQUARTER คืนตารางวันที่ของไตรมาสถัดไปจากบริบทวันที่ปัจจุบัน มักใช้เป็นตารางตัวกรองใน CALCULATE เพื่อคำนวณค่าแบบ “ไตรมาสถัดไป”
OPENINGBALANCEQUARTER ประเมิน Expression ณ วันที่เทียบเท่ากับวันสิ้นไตรมาสก่อนหน้า ภายใต้บริบทตัวกรองที่กำหนด ใช้เพื่อหา “ค่าเปิดงวดรายไตรมาส”
PARALLELPERIOD คืนตารางวันที่ที่ขนานกับช่วงเวลาปัจจุบัน แต่เลื่อนไปข้างหน้าหรือย้อนหลัง และขยายขอบเขตให้ครอบคลุมทั้งหน่วยเวลาที่ระบุ (MONTH/QUARTER/YEAR) เสมอ เหมาะกับการเทียบยอดรวมทั้งเดือน/ไตรมาส/ปี
PREVIOUSDAY คืนตารางวันที่ของวันก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับทำตัวชี้วัดแบบเทียบวันต่อวัน โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
PREVIOUSMONTH คืนตารางวันที่ทั้งหมดของเดือนก่อนหน้า โดยอ้างอิงจากวันแรกของบริบทปัจจุบัน เหมาะกับการทำ Measure เปรียบเทียบ Month-over-Month เช่น ยอดขายเดือนก่อนหน้า ข้อแตกต่างสำคัญกับ DATEADD คือ PREVIOUSMONTH คืนทั้งเดือนเสมอ ไม่ว่าจะเลือกวันไหนก็ตาม
PREVIOUSWEEK คืนตารางวันที่ของสัปดาห์ก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับตัวชี้วัดแบบ Week-over-Week โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
PREVIOUSYEAR คืนตารางวันที่ของปีก่อนหน้า ตามบริบทวันที่ปัจจุบัน เหมาะสำหรับตัวชี้วัดแบบ Year-over-Year โดยนำตารางวันที่ไปใช้เป็นตัวกรองเวลา
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
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
อีเมลของคุณจะไม่ถูกเผยแพร่