Thep Excel

SAMEPERIODLASTYEARคืนช่วงเวลาเดียวกันของปีก่อนหน้า (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

fx
=SAMEPERIODLASTYEAR(<dates>)

ความนิยม8/10
ความยาก4/10
ประโยชน์9/10

อัปเดต 18 December 2025

Syntax & Arguments

อาร์กิวเมนต์ ชนิด คำอธิบาย
dates column คอลัมน์ที่มี date values หรือ expression ที่คืนค่า table ที่มีคอลัมน์วันที่เดียว ควรใช้คอลัมน์จาก date table ที่ mark แล้วและมีวันที่ต่อเนื่องครอบคลุมทุกวันของปี function จะคืน table ของวันที่ที่เลื่อนย้อนกลับไป 1 ปีจากวันที่ที่อยู่ใน filter context ปัจจุบัน

Additional Notes

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 เพื่อคำนวณยอดขายของปีก่อนได้ทันทีครับ

ข้อกำหนดสำคัญ: Date Table ที่ต่อเนื่อง

เรื่องนี้สำคัญมากครับ… SAMEPERIODLASTYEAR ต้องการ date table ที่ครบถ้วนและต่อเนื่อง โดยต้องมีวันที่ครอบคลุมทุกวันตั้งแต่ 1 มกราคม ถึง 31 ธันวาคม ของทุกปีที่ต้องการวิเคราะห์
.
หาก date table มีช่องว่างหรือขาดวันที่บางวัน การคำนวณ YoY อาจให้ผลลัพธ์ที่ไม่ถูกต้องหรือแสดงค่าว่าง ซึ่งน่าปวดหัวมากเวลา debug 😅
.
นอกจากนี้ควร mark date table ในโมเดลด้วยนะครับ เพื่อให้ DAX engine จัดการ filter context ได้อย่างเหมาะสม ส่วนตัวผมแนะนำให้ทำเป็นขั้นตอนแรกเสมอเวลา setup model ใหม่ครับ 💡

พฤติกรรมพิเศษ: Month-End Extension

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

มาดูกันว่าเราควรใช้ SAMEPERIODLASTYEAR เมื่อไหร่บ้างครับ:

  • เปรียบเทียบ Year-over-Year – คำนวณยอดขาย ยอดรายได้ หรือ metrics อื่นๆ ของช่วงเดียวกันในปีก่อนหน้า เป็น use case ที่พบบ่อยที่สุดในงาน BI ครับ
  • คำนวณ growth rate – หาเปอร์เซ็นต์การเติบโตโดยเทียบปีปัจจุบันกับปีก่อน เหมาะสำหรับ executive dashboard มาก 📊
  • วิเคราะห์แนวโน้ม – สร้าง chart เปรียบเทียบข้อมูลปีนี้กับปีก่อนในแกนเดียวกัน ช่วยมองเห็น seasonality ได้ชัดเจน
  • Dashboard KPIs – แสดงตัวเลขปีก่อนข้างๆ ตัวเลขปัจจุบันเพื่อเปรียบเทียบ ส่วนตัวผมเจอใช้บ่อยมากในงาน performance report ครับ

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 (สำหรับคำนวณเปอร์เซ็นต์การเติบโตอย่างปลอดภัย)

How it works

เปรียบเทียบยอดขายปีต่อปี (Year-over-Year)

สร้าง measure เพื่อคำนวณยอดขายของช่วงเดียวกันในปีก่อนหน้าเพื่อนำมาเปรียบเทียบกับยอดขายปัจจุบัน แสดงทั้งสองค่าใน table หรือ card visualization เพื่อดูการเติบโต

คำนวณ Growth Rate และแสดง KPI

หาเปอร์เซ็นต์การเติบโตโดยเทียบยอดปีนี้กับยอดปีก่อน แล้วหารด้วยยอดปีก่อน ใช้ DIVIDE เพื่อจัดการกรณีปีก่อนเป็น 0 หรือ BLANK แสดงผลใน KPI card เพื่อติดตามประสิทธิภาพธุรกิจ

วิเคราะห์แนวโน้มรายเดือนเทียบปีก่อน

สร้าง line chart เปรียบเทียบ sales หรือ revenue รายเดือนของปีปัจจุบันกับปีก่อนหน้าในกราฟเดียวกัน ช่วยให้มองเห็นรูปแบบการเติบโตหรือลดลงตามฤดูกาล (seasonality)

เทียบ Year-to-Date กับปีก่อน

ใช้ร่วมกับ DATESYTD หรือ TOTALYTD เพื่อเปรียบเทียบยอดสะสมตั้งแต่ต้นปีปัจจุบันกับยอดสะสมช่วงเดียวกันของปีก่อน ช่วยประเมินว่าธุรกิจเติบโตหรือลดลงในภาพรวมของปี

Examples

ตัวอย่างที่ 1: ยอดขายปีก่อนหน้า (Sales Last Year)Sales Last Year = CALCULATE( SUM(Sales[Amount]), SAMEPERIODLASTYEAR('Date'[Date]) ) // บริบท: Date table มีคอลัมน์ Date ที่ต่อเนื่องครอบคลุม 2 ปี // Sales table…

SAMEPERIODLASTYEAR รับคอลัมน์ Date จาก date table แล้วคืน table ของวันที่ทั้งหมดที่เลื่อนย้อนไป 1 ปี

CALCULATE ใช้ table นี้เป็น filter argument เพื่อแก้ไข filter context และคำนวณ SUM(Sales[Amount]) สำหรับช่วงปีก่อนหน้า

ที่เจ๋งคือ function นี้เข้าใจ context อัตโนมัติ ไม่ว่าจะดูรายเดือน รายไตรมาส หรือช่วงใดก็ตาม มันจะเลื่อนย้อนไป 1 ปีพอดี ทำให้ได้ยอดขาย Last Year ที่สามารถนำมาเทียบกับยอดขายปีปัจจุบันได้อย่างแม่นยำ 😎

fx
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
ตัวอย่างที่ 2: คำนวณเปอร์เซ็นต์การเติบโต (YoY Growth %)YoY Growth % = VAR CurrentYearSales = SUM(Sales[Amount]) VAR LastYearSales = CALCULATE( SUM(Sales[Amount]), SAMEPERIODLASTYEAR('Date'[Date]) ) RETURN DIVIDE( Cu…

ใช้ VAR เพื่อเก็บยอดขายปีปัจจุบัน (CurrentYearSales) และยอดขายปีก่อน (LastYearSales) ที่คำนวณด้วย CALCULATE และ SAMEPERIODLASTYEAR

จากนั้นใช้ DIVIDE เพื่อหาเปอร์เซ็นต์การเติบโตโดยเอา (ปีนี้ – ปีก่อน) หารด้วยปีก่อน DIVIDE จะคืน BLANK ถ้าปีก่อนเป็น 0 หรือ BLANK เพื่อป้องกัน division by zero error 💡

การใช้ VAR pattern แบบนี้ทำให้ formula อ่านง่ายและ DAX engine คำนวณแต่ละ expression เพียงครั้งเดียว (materialization)

ส่วนตัวผมชอบใช้แบบนี้เพราะ debug ง่ายกว่าเวลามีปัญหา สามารถแยกดูว่า LastYearSales คำนวณออกมาถูกต้องหรือเปล่าได้ทันที 😎

fx
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
ตัวอย่างที่ 3: เปรียบเทียบยอดขาย Current vs Last Year ในตาราง// Measure 1: ยอดขายปัจจุบัน Current Year Sales = SUM(Sales[Amount]) // Measure 2: ยอดขายปีก่อน Last Year Sales = CALCULATE( [Current Year Sales], SAMEPERIODLAS…

แยก measures เป็น 3 ตัวเพื่อแสดงข้อมูลที่ครบถ้วน Current Year Sales คำนวณยอดขายปกติตาม filter context

Last Year Sales ใช้ CALCULATE ร่วมกับ SAMEPERIODLASTYEAR เพื่อแก้ไข filter context ให้อ้างอิงปีก่อนหน้า โดยเรียกใช้ [Current Year Sales] measure ซ้ำเพื่อให้โครงสร้างสอดคล้องกัน (reuse pattern นี้ช่วยให้แก้ไข logic ที่เดียวได้เลย ไม่ต้องแก้ทีละตัว)

Sales Variance หาส่วนต่างระหว่างสองปีโดยตรง เมื่อนำ measures เหล่านี้ใส่ใน table visual พร้อม Year และ Month ใน rows จะเห็นภาพเปรียบเทียบที่ชัดเจนทุกเดือน

ส่วนตัวผมเจอใช้ pattern นี้บ่อยมากใน executive dashboard เพราะผู้บริหารชอบเห็นตัวเลขทั้งสองปีเคียงข้างกัน ดูได้ทันทีว่าโตหรือลดลง 📊

fx
// 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
ตัวอย่างที่ 4: Year-to-Date เทียบกับปีก่อน (Advanced)YTD Sales vs Last Year YTD = VAR CurrentYTD = CALCULATE( SUM(Sales[Amount]), DATESYTD('Date'[Date]) ) VAR LastYearYTD = CALCULATE( SUM(Sales[Amount]), SAMEPERIO…

ตัวอย่างนี้แสดงการใช้ SAMEPERIODLASTYEAR ร่วมกับ time intelligence functions อื่นๆ แบบ advanced

CurrentYTD ใช้ DATESYTD เพื่อคำนวณยอดสะสมตั้งแต่ต้นปีจนถึงวันที่ล่าสุดใน filter context LastYearYTD นำ table ที่ได้จาก DATESYTD (ซึ่งเป็นช่วง year-to-date) มาป้อนเข้า SAMEPERIODLASTYEAR เพื่อเลื่อนย้อนกลับไป 1 ปี ทำให้ได้ยอดสะสมช่วงเดียวกันของปีก่อน

จากนั้นคำนวณส่วนต่าง (YTDGrowth) และเปอร์เซ็นต์การเติบโต (YTDGrowthPercent) ด้วย DIVIDE

Pattern นี้มีประโยชน์อย่างมากสำหรับ executive dashboards ที่ต้องการเห็นว่าธุรกิจในปีนี้เทียบกับปีก่อนในช่วงเดียวกันเป็นอย่างไร (เช่น "YTD Sales ถึงเดือนมิถุนายน" เปรียบเทียบระหว่าง 2 ปี)

ส่วนตัวผมเจอใช้บ่อยมากในงาน BI เพราะเป็นคำถามที่ผู้บริหารถามบ่อยที่สุด: "ปีนี้เราทำได้ดีกว่าปีก่อนมั้ย?" 📊

fx
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

FAQs

ทำไม SAMEPERIODLASTYEAR ถึงแสดงค่าว่าง (BLANK) ในบางช่วง+

สาเหตุที่พบบ่อยที่สุดคือ 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 ต่างจาก PREVIOUSYEAR อย่างไร+

SAMEPERIODLASTYEAR คืนช่วงเดียวกันของปีก่อน (เช่น ถ้า filter context เป็นมกราคม 2024 จะคืนมกราคม 2023)

ในขณะที่ PREVIOUSYEAR คืนปีก่อนหน้าทั้งปี (ทั้ง 12 เดือน) ไม่ว่า filter context ปัจจุบันจะเป็นเดือนไหนก็ตาม

ตัวอย่างให้เห็นภาพ: ถ้าคุณดูข้อมูลเดือนมิถุนายน 2024 → SAMEPERIODLASTYEAR จะคืนมิถุนายน 2023 แต่ PREVIOUSYEAR จะคืน 1 ม.ค. – 31 ธ.ค. 2023 ทั้งหมด

ดังนั้น SAMEPERIODLASTYEAR เหมาะสำหรับ YoY comparison (เปรียบเทียบช่วงเดียวกัน) ส่วน PREVIOUSYEAR เหมาะสำหรับดูภาพรวมของทั้งปีก่อนหน้า 📊

สามารถใช้ SAMEPERIODLASTYEAR กับ fiscal year (ปีงบการเงิน) ได้หรือไม่+

ได้ครับ แต่ต้องจัดเตรียม 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 ให้รองรับตั้งแต่ต้นเลยครับ จะได้ไม่ต้องมานั่งแก้ทีหลัง 😅

ใช้ SAMEPERIODLASTYEAR กับ Year-to-Date (YTD) ได้อย่างไร+

สามารถใช้ร่วมกับ 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 อย่างไร และควรเลือกใช้ตัวไหน+

SAMEPERIODLASTYEAR ทำงานเทียบเท่ากับ DATEADD(dates, -1, YEAR) คือเลื่อนวันที่ย้อนกลับไป 1 ปี ทั้งสองให้ผลลัพธ์เดียวกันในกรณีส่วนใหญ่

แต่ SAMEPERIODLASTYEAR อ่านง่ายกว่าเพราะชื่อสื่อความหมายชัดเจนว่าเป็น "same period last year" เหมาะสำหรับ YoY analysis

ส่วน DATEADD มีความยืดหยุ่นกว่าเพราะสามารถระบุจำนวนปี เดือน วัน ที่ต้องการเลื่อนได้เอง เหมาะกับกรณีที่ต้องการเลื่อนช่วงเวลาแบบกำหนดเอง (เช่น -2 ปี, -6 เดือน)

ส่วนตัวผมแนะนำให้ใช้ SAMEPERIODLASTYEAR เมื่อเป็น YoY comparison แบบมาตรฐาน เพราะคนอื่นอ่าน formula แล้วเข้าใจทันที แต่ถ้าต้องการความยืดหยุ่นในการกำหนดช่วงเวลา ก็ใช้ DATEADD แทนครับ 💡

Month-end extension semantics คืออะไร และมีผลอย่างไร+

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 และมีผลต่อ SAMEPERIODLASTYEAR อย่างไร+

การ 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 พื้นฐานที่ช่วยป้องกันปัญหาหลายอย่างได้ 💡

Resources & Related

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

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

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

DATESMTD

DATESMTD คืนตารางวันที่ของช่วงตั้งแต่ต้นเดือนถึงวันที่ล่าสุดใน filter context เหมาะกับการทำยอดสะสมตั้งแต่ต้นเดือน (MTD) โดยใช้ร่วมกับ CALCULATE และควรใช้คู่กับ ShowValueForDates pattern เพื่อไม่ให้แสดงค่าในวันที่ยังไม่มีข้อมูล

DATESQTD

DATESQTD คืนตารางวันที่ของช่วงตั้งแต่ต้นไตรมาสถึงวันที่ล่าสุดในบริบทปัจจุบัน เหมาะสำหรับสร้างมาตรวัด QTD ใน CALCULATE โดยทำงานร่วมกับ Time Intelligence Functions ตัวอื่นๆ ได้ดี และควรใช้คู่กับ ShowValueForDates pattern เพื่อป้องกันการแสดงค่าในอนาคต

DATESYTD

DATESYTD คืนตารางวันที่ของช่วงตั้งแต่ต้นปีถึงวันที่สุดท้ายที่มองเห็นใน Filter Context ใช้เป็นตัวกรองเวลาใน CALCULATE สำหรับการคำนวณยอดสะสมตั้งแต่ต้นปี รองรับทั้งปีปฏิทินและปีบัญชี (Fiscal Year) ด้วย YearEndDate argument

OPENINGBALANCEMONTH

OPENINGBALANCEMONTH ประเมิน Expression ณ จุดเปิดเดือน (วันสิ้นเดือนก่อนหน้า) เหมาะสำหรับหา opening balance ของยอดคงเหลือ สต็อก หรือสถิติ ณ จุดเริ่มเดือน

PARALLELPERIOD

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

PREVIOUSMONTH

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

PREVIOUSQUARTER

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

PREVIOUSYEAR

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

TOTALYTD

TOTALYTD คำนวณยอดสะสมตั้งแต่ต้นปี (Year-to-Date) ของ expression ใดๆ โดยอิงจาก Date table และสามารถกำหนด fiscal year end date เพื่อรองรับปีงบประมาณที่ไม่ตรงกับปีปฏิทินได้
.
ส่วนตัวผมใช้บ่อยมากตอนต้องวิเคราะห์ยอดขาย KPI และรายงานทางการเงินที่ต้องการติดตามความก้าวหน้าตลอดทั้งปีครับ

Date and Time (2)
CALENDAR

CALENDAR ใช้สำหรับสร้างตารางวันที่ครบถ้วนตั้งแต่วันเริ่มต้นถึงวันสิ้นสุดโดยไม่มีช่องว่าง เหมาะสำหรับสร้างตารางวันที่โครงสร้างพื้นฐาน (Date Dimension) ที่ใช้ร่วมกับ Time Intelligence Function

CALENDARAUTO

CALENDARAUTO สร้างตารางวันที่อัตโนมัติโดยอิงช่วงวันที่ที่พบในโมเดล และสามารถกำหนดเดือนสิ้นสุดปีบัญชีได้ เหมาะกับการสร้าง Date table แบบเร็ว ๆ แต่ควรระวังค่าวันที่ผิดปกติในข้อมูล

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

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