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
=SAMEPERIODLASTYEAR(<dates>)
=SAMEPERIODLASTYEAR(<dates>)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| dates | column | Yes | คอลัมน์ที่มี date values หรือ expression ที่คืนค่า table ที่มีคอลัมน์วันที่เดียว ควรใช้คอลัมน์จาก date table ที่ mark แล้วและมีวันที่ต่อเนื่องครอบคลุมทุกวันของปี function จะคืน table ของวันที่ที่เลื่อนย้อนกลับไป 1 ปีจากวันที่ที่อยู่ใน filter context ปัจจุบัน |
สร้าง measure เพื่อคำนวณยอดขายของช่วงเดียวกันในปีก่อนหน้าเพื่อนำมาเปรียบเทียบกับยอดขายปัจจุบัน แสดงทั้งสองค่าใน table หรือ card visualization เพื่อดูการเติบโต
หาเปอร์เซ็นต์การเติบโตโดยเทียบยอดปีนี้กับยอดปีก่อน แล้วหารด้วยยอดปีก่อน ใช้ DIVIDE เพื่อจัดการกรณีปีก่อนเป็น 0 หรือ BLANK แสดงผลใน KPI card เพื่อติดตามประสิทธิภาพธุรกิจ
สร้าง line chart เปรียบเทียบ sales หรือ revenue รายเดือนของปีปัจจุบันกับปีก่อนหน้าในกราฟเดียวกัน ช่วยให้มองเห็นรูปแบบการเติบโตหรือลดลงตามฤดูกาล (seasonality)
ใช้ร่วมกับ DATESYTD หรือ TOTALYTD เพื่อเปรียบเทียบยอดสะสมตั้งแต่ต้นปีปัจจุบันกับยอดสะสมช่วงเดียวกันของปีก่อน ช่วยประเมินว่าธุรกิจเติบโตหรือลดลงในภาพรวมของปี
Sales Last Year = CALCULATE( SUM(Sales[Amount]), SAMEPERIODLASTYEAR('Date'[Date]) ) // บริบท: Date table มีคอลัมน์ Date ที่ต่อเนื่องครอบคลุม 2 ปี // Sales table…Sales Last Year =
CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR('Date'[Date])
)
// บริบท: Date table มีคอลัมน์ Date ที่ต่อเนื่องครอบคลุม 2 ปี
// Sales table มี relationship กับ Date table ผ่าน Date column
// Result: ยอดขายของช่วงเดียวกันในปีก่อนหน้า
หาก filter context เป็นเดือนมกราคม 2024 measure นี้จะคืนยอดขายทั้งหมดของเดือนมกราคม 2023
YoY Growth % = VAR CurrentYearSales = SUM(Sales[Amount]) VAR LastYearSales = CALCULATE( SUM(Sales[Amount]), SAMEPERIODLASTYEAR('Date'[Date]) ) RETURN DIVIDE( Cu…YoY Growth % =
VAR CurrentYearSales = SUM(Sales[Amount])
VAR LastYearSales =
CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR('Date'[Date])
)
RETURN
DIVIDE(
CurrentYearSales - LastYearSales,
LastYearSales,
BLANK()
)
// บริบท: เปรียบเทียบยอดขายปีนี้กับปีก่อน
// Result: เปอร์เซ็นต์การเติบโต (ค่าบวก = เติบโต, ค่าลบ = ลดลง)
ถ้ายอดขายปี 2024 = 150,000 และปี 2023 = 120,000 จะได้ (150000-120000)/120000 = 0.25 หรือ 25% growth
// Measure 1: ยอดขายปัจจุบัน Current Year Sales = SUM(Sales[Amount]) // Measure 2: ยอดขายปีก่อน Last Year Sales = CALCULATE( [Current Year Sales], SAMEPERIODLAS…// Measure 1: ยอดขายปัจจุบัน
Current Year Sales = SUM(Sales[Amount])
// Measure 2: ยอดขายปีก่อน
Last Year Sales =
CALCULATE(
[Current Year Sales],
SAMEPERIODLASTYEAR('Date'[Date])
)
// Measure 3: ส่วนต่างยอดขาย
Sales Variance =
[Current Year Sales] - [Last Year Sales]
// บริบท: Date table มี Year, Month columns
// สร้าง table visual ใส่ Date[Year], Date[Month] ใน rows
// ใส่ทั้ง 3 measures ใน values
// Result: เห็นเปรียบเทียบชัดเจนทุกเดือนของทุกปี
Table จะแสดง Year-Month แถว และ 3 คอลัมน์: ยอดปีนี้, ยอดปีก่อน, ส่วนต่าง เช่น 2024-Jan: 50K, 40K, +10K
YTD Sales vs Last Year YTD = VAR CurrentYTD = CALCULATE( SUM(Sales[Amount]), DATESYTD('Date'[Date]) ) VAR LastYearYTD = CALCULATE( SUM(Sales[Amount]), SAMEPERIO…YTD Sales vs Last Year YTD =
VAR CurrentYTD =
CALCULATE(
SUM(Sales[Amount]),
DATESYTD('Date'[Date])
)
VAR LastYearYTD =
CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR(
DATESYTD('Date'[Date])
)
)
VAR YTDGrowth = CurrentYTD - LastYearYTD
VAR YTDGrowthPercent = DIVIDE(YTDGrowth, LastYearYTD, BLANK())
RETURN
YTDGrowthPercent
// บริบท: Date table marked และมีวันที่ครบ 2+ ปี
// DATESYTD คืนช่วงต้นปีจนถึงวันที่ล่าสุดใน context
// SAMEPERIODLASTYEAR เลื่อนช่วงนั้นไปปีก่อน
// Result: เปอร์เซ็นต์การเติบโตของยอดสะสมปีนี้เทียบปีก่อน
ถ้าวันที่ปัจจุบันเป็น 15 มิถุนายน 2024 measure จะเทียบยอดสะสม 1 ม.ค.-15 มิ.ย. 2024 กับ 1 ม.ค.-15 มิ.ย. 2023
สาเหตุที่พบบ่อยที่สุดคือ date table ไม่ครอบคลุมปีก่อนหน้า หรือไม่มีข้อมูล (data) ในปีก่อนหน้าสำหรับช่วงนั้น
.
ตัวอย่างเช่น ถ้า date table มีเฉพาะปี 2023-2024 และคุณดูข้อมูลเดือนมกราคม 2023 SAMEPERIODLASTYEAR จะพยายามอ้างอิงมกราคม 2022 ซึ่งไม่มีใน date table จึงคืน empty table ทำให้ CALCULATE คืน BLANK 😅
.
นอกจากนี้ยังอาจเกิดจากการที่ date table มีช่องว่าง (gaps) หรือไม่ได้ mark เป็น date table ในโมเดล แนะนำให้ตรวจสอบว่า date table มีวันที่ครบถ้วนต่อเนื่องครอบคลุมทุกปีที่ต้องการวิเคราะห์ และได้ mark เป็น date table แล้วครับ
SAMEPERIODLASTYEAR คืนช่วงเดียวกันของปีก่อน (เช่น ถ้า filter context เป็นมกราคม 2024 จะคืนมกราคม 2023)
.
ในขณะที่ PREVIOUSYEAR คืนปีก่อนหน้าทั้งปี (ทั้ง 12 เดือน) ไม่ว่า filter context ปัจจุบันจะเป็นเดือนไหนก็ตาม
.
ตัวอย่างให้เห็นภาพ: ถ้าคุณดูข้อมูลเดือนมิถุนายน 2024 → SAMEPERIODLASTYEAR จะคืนมิถุนายน 2023 แต่ PREVIOUSYEAR จะคืน 1 ม.ค. – 31 ธ.ค. 2023 ทั้งหมด
.
ดังนั้น SAMEPERIODLASTYEAR เหมาะสำหรับ YoY comparison (เปรียบเทียบช่วงเดียวกัน) ส่วน PREVIOUSYEAR เหมาะสำหรับดูภาพรวมของทั้งปีก่อนหน้า 📊
ได้ครับ แต่ต้องจัดเตรียม date table ที่รองรับ fiscal year อย่างถูกต้อง โดยมีคอลัมน์ FiscalYear และ FiscalMonth ที่คำนวณตามรอบปีงบการเงินของบริษัท (เช่น ตุลาคม – กันยายน)
.
จากนั้นสามารถใช้ SAMEPERIODLASTYEAR กับคอลัมน์ Date ตามปกติ และ filter context จะถูกประมวลผลตาม fiscal calendar ที่กำหนดไว้
.
อีกทางเลือกหนึ่งใน DAX เวอร์ชันใหม่คือการใช้ Calendar Tables ซึ่งรองรับ fiscal calendars โดยตรง (ดูข้อมูลเพิ่มเติมใน Microsoft Learn เกี่ยวกับ Calendar-based time intelligence) ส่วนตัวผมว่าถ้าบริษัทใช้ fiscal year ก็ควร setup date table ให้รองรับตั้งแต่ต้นเลยครับ จะได้ไม่ต้องมานั่งแก้ทีหลัง 😅
สามารถใช้ร่วมกับ DATESYTD หรือ TOTALYTD ได้โดยส่ง expression ที่ได้จาก DATESYTD เข้าไปใน SAMEPERIODLASTYEAR
.
ตัวอย่าง: CALCULATE(SUM(Sales[Amount]), SAMEPERIODLASTYEAR(DATESYTD(‘Date'[Date])))
.
สูตรนี้จะคำนวณยอดสะสมตั้งแต่ต้นปีจนถึงวันที่ล่าสุดใน filter context แล้วเลื่อนย้อนกลับไป 1 ปี ทำให้ได้ยอด YTD ของปีก่อนหน้าในช่วงเดียวกัน
.
Pattern นี้มีประโยชน์มากสำหรับ dashboard ที่แสดง YTD comparison เช่น YTD Sales 2024 vs YTD Sales 2023 (ถึงวันที่เดียวกัน) ส่วนตัวผมใช้บ่อยมากเวลาทำ monthly performance report ครับ 📊
SAMEPERIODLASTYEAR ทำงานเทียบเท่ากับ DATEADD(dates, -1, YEAR) คือเลื่อนวันที่ย้อนกลับไป 1 ปี ทั้งสองให้ผลลัพธ์เดียวกันในกรณีส่วนใหญ่
.
แต่ SAMEPERIODLASTYEAR อ่านง่ายกว่าเพราะชื่อสื่อความหมายชัดเจนว่าเป็น “same period last year” เหมาะสำหรับ YoY analysis
.
ส่วน DATEADD มีความยืดหยุ่นกว่าเพราะสามารถระบุจำนวนปี เดือน วัน ที่ต้องการเลื่อนได้เอง เหมาะกับกรณีที่ต้องการเลื่อนช่วงเวลาแบบกำหนดเอง (เช่น -2 ปี, -6 เดือน)
.
ส่วนตัวผมแนะนำให้ใช้ SAMEPERIODLASTYEAR เมื่อเป็น YoY comparison แบบมาตรฐาน เพราะคนอื่นอ่าน formula แล้วเข้าใจทันที แต่ถ้าต้องการความยืดหยุ่นในการกำหนดช่วงเวลา ก็ใช้ DATEADD แทนครับ 💡
Month-end extension เป็นพฤติกรรมพิเศษของ SAMEPERIODLASTYEAR ที่เมื่อ filter context ปัจจุบันรวมถึง 2 วันสุดท้ายของเดือน function จะขยายผลลัพธ์ให้ครอบคลุมถึงวันสุดท้ายของเดือนนั้นในปีก่อนหน้า
.
ตัวอย่างให้เห็นภาพ: ถ้า filter context เป็นวันที่ 27-28 กุมภาพันธ์ 2009 → SAMEPERIODLASTYEAR จะคืนวันที่ 27-29 กุมภาพันธ์ 2008 (รวมวันที่ 29 ด้วยแม้ว่า context ต้นทางจะไม่รวม) เนื่องจากปี 2008 เป็นปีอธิกสุรทิน
.
พฤติกรรมนี้ช่วยให้การเปรียบเทียบ month-end periods ครบถ้วนแม้จะมีความยาวเดือนที่แตกต่างกัน แต่ถ้า filter context มีเพียงวันที่ 27 เดือนเดียว (ไม่รวมวันที่ 28) จะไม่เกิด extension และจะคืนเฉพาะวันที่ 27 ของปีก่อนเท่านั้น
.
ส่วนตัวผมว่า behavior นี้ค่อนข้าง subtle แต่สำคัญมาก โดยเฉพาะเวลาทำ month-end closing reports ครับ 📅
การ mark date table (ผ่าน Table Tools → Mark as Date Table ใน Power BI) บอก DAX engine ว่าตารางนี้เป็น date table อย่างเป็นทางการของโมเดล
.
เมื่อ mark แล้ว DAX จะเพิ่ม ALL function โดยอัตโนมัติใน CALCULATE statements ที่เกี่ยวข้องกับคอลัมน์วันที่ ทำให้ time intelligence functions เช่น SAMEPERIODLASTYEAR ทำงานได้ถูกต้องและประสิทธิภาพดีขึ้น
.
โดยเฉพาะเมื่อมีหลาย date tables หรือ date hierarchies ใน model การไม่ mark date table อาจทำให้เกิดปัญหา filter context ที่ไม่คาดคิด หรือผลลัพธ์ที่ไม่ถูกต้อง
.
ส่วนตัวผมแนะนำให้ mark date table เสมอเลยครับ เป็น best practice พื้นฐานที่ช่วยป้องกันปัญหาหลายอย่างได้ 💡
SAMEPERIODLASTYEAR เป็น time intelligence function ที่ทรงพลังมากตัวหนึ่งใน DAX ครับ
.
มันคืนค่าเป็น table ของวันที่ซึ่งเลื่อนย้อนกลับไป 1 ปี จากช่วงวันที่ที่อยู่ใน filter context ปัจจุบัน ออกแบบมาโดยเฉพาะเพื่อการเปรียบเทียบแบบ Year-over-Year (YoY) ซึ่งเป็นการวิเคราะห์ที่สำคัญมากในธุรกิจเพื่อดูแนวโน้มการเติบโตหรือลดลงเมื่อเทียบกับช่วงเดียวกันของปีก่อนหน้า
ที่เจ๋งคือ การทำงานของ SAMEPERIODLASTYEAR นั้นเทียบเท่ากับการใช้ DATEADD ด้วยพารามิเตอร์ -1, YEAR แต่ SAMEPERIODLASTYEAR มีชื่อที่สื่อความหมายชัดเจนกว่ามากว่าเป็นการอ้างอิงถึง “ช่วงเดียวกันของปีก่อน” ทำให้ formula อ่านง่ายและเข้าใจได้ทันที 💡
.
ตัวอย่างเช่น หากคุณกำลังดูยอดขายของเดือนมกราคม 2024 การใช้ SAMEPERIODLASTYEAR จะคืน table ของวันที่ทั้งหมดในเดือนมกราคม 2023 ซึ่งเราสามารถนำไปใช้เป็น filter argument ใน CALCULATE เพื่อคำนวณยอดขายของปีก่อนได้ทันทีครับ
เรื่องนี้สำคัญมากครับ… SAMEPERIODLASTYEAR ต้องการ date table ที่ครบถ้วนและต่อเนื่อง โดยต้องมีวันที่ครอบคลุมทุกวันตั้งแต่ 1 มกราคม ถึง 31 ธันวาคม ของทุกปีที่ต้องการวิเคราะห์
.
หาก date table มีช่องว่างหรือขาดวันที่บางวัน การคำนวณ YoY อาจให้ผลลัพธ์ที่ไม่ถูกต้องหรือแสดงค่าว่าง ซึ่งน่าปวดหัวมากเวลา debug 😅
.
นอกจากนี้ควร mark date table ในโมเดลด้วยนะครับ เพื่อให้ DAX engine จัดการ filter context ได้อย่างเหมาะสม ส่วนตัวผมแนะนำให้ทำเป็นขั้นตอนแรกเสมอเวลา setup model ใหม่ครับ 💡
SAMEPERIODLASTYEAR มีพฤติกรรมพิเศษที่เรียกว่า “month-end extension semantics” ซึ่งค่อนข้าง subtle แต่สำคัญมากครับ
.
คือ เมื่อช่วงวันที่ใน filter context ปัจจุบันรวมถึง 2 วันสุดท้ายของเดือน function จะขยายผลลัพธ์ให้ครอบคลุมถึงวันสุดท้ายของเดือนนั้นในปีก่อนหน้าด้วย
.
ตัวอย่างให้เห็นภาพ… หาก filter context เป็นวันที่ 27-28 กุมภาพันธ์ 2009 SAMEPERIODLASTYEAR จะคืนวันที่ 27-29 กุมภาพันธ์ 2008 (รวมวันที่ 29 ด้วยเพราะ 2008 เป็นปีอธิกสุรทิน) แต่ถ้า filter context เป็นเพียงวันที่ 27 กุมภาพันธ์เท่านั้น ก็จะคืนเพียงวันที่ 27 กุมภาพันธ์ 2008
.
พฤติกรรมนี้ช่วยให้การเปรียบเทียบ month-end periods ครบถ้วนแม้จะมีความยาวเดือนที่แตกต่างกันครับ 😎
มาดูกันว่าเราควรใช้ SAMEPERIODLASTYEAR เมื่อไหร่บ้างครับ:
Function นี้ใช้ได้ทั้งใน measures, calculated columns และ calculated tables แต่ ไม่แนะนำให้ใช้ใน visual calculations เนื่องจากอาจให้ผลลัพธ์ที่ไม่มีความหมาย
.
นอกจากนี้ SAMEPERIODLASTYEAR ไม่รองรับใน DirectQuery mode สำหรับ calculated columns หรือ row-level security (RLS) rules นะครับ ⚠️
Related functions ที่มักใช้ร่วมกับ SAMEPERIODLASTYEAR ได้แก่ CALCULATE (สำหรับแก้ไข filter context), PARALLELPERIOD (สำหรับเลื่อน period แบบกำหนดเอง), DATEADD (สำหรับเลื่อนช่วงเวลาแบบยืดหยุ่น), PREVIOUSYEAR (สำหรับอ้างอิงปีก่อนหน้าทั้งปี) และ DIVIDE (สำหรับคำนวณเปอร์เซ็นต์การเติบโตอย่างปลอดภัย)