فصل ششم — Time Intelligence؛ تحلیل زمان در DAX
Time Intelligence؛ تحلیل زمان در DAX
بخشی از آموزش جامع Power BI
محتوای درس Time Intelligence؛ تحلیل زمان در DAX
کتاب جامع Power BI — آموزش پروژهمحور و کاربردی
مقدمه؛ مدیر فقط فروش امروز را نمیخواهد
فرض کن مدیرعامل شرکت هانا میپرسد: «این ماه چقدر فروختیم؟» عدد را میدهیم. سؤال بعدی تقریباً قطعی است: «نسبت به ماه قبل چی؟ نسبت به پارسال چطور؟ از اول سال تا الان چقدر فروختیم؟»
اینجاست که تحلیل زمانی یا Time Intelligence وارد بازی میشود. در این فصل یاد میگیریم چطور فروش را در بازههای زمانی مختلف مقایسه کنیم و از یک عدد ساده به تحلیل روند برسیم.
۶.۱. پیشنیاز اصلی؛ Date Table درست
قبل از فرمولهای زمانی، باید جدول تاریخ قابل اعتماد داشته باشیم. یک Date Dimension معمولاً برای هر روز یک ردیف دارد و ستونهای کمکی مثل سال، ماه، فصل و شماره ماه را نگه میدارد.
| Date | Year | MonthNo | MonthName | Quarter |
|---|---|---|---|---|
| 2026-01-01 | 2026 | 1 | January | Q1 |
| 2026-02-01 | 2026 | 2 | February | Q1 |
در مدل شرکت هانا DimDate با Relationship مناسب به تاریخ فروش FactSales متصل میشود.
۶.۲. چرا MonthName به تنهایی کافی نیست؟
اگر فقط نام ماه را در Visual بگذاریم، ممکن است Power BI آن را الفبایی مرتب کند. برای همین MonthName معمولاً باید بر اساس MonthNo مرتب شود.
MonthName → Sort by Column → MonthNo
این جزئیات کوچک روی خوانایی گزارش اثر زیادی دارد.
۶.۳. Measure پایه فروش
تقریباً همه محاسبات زمانی را بهتر است روی یک Measure پایه بنا کنیم.
Total Sales = SUM(FactSales[SalesAmount])
بعد به جای تکرار منطق فروش، Measureهای زمانی را با استفاده از Total Sales میسازیم.
۶.۴. فروش از ابتدای سال تا امروز؛ YTD
YTD یعنی Year-to-Date؛ یعنی از ابتدای سال تا Context زمانی فعلی.
Sales YTD =
TOTALYTD(
[Total Sales],
DimDate[Date]
)
اگر گزارش روی ماه شهریور باشد، YTD فروش تجمعی از ابتدای سال تا همان محدوده را نشان میدهد.
۶.۵. MTD و QTD
Sales MTD =
TOTALMTD(
[Total Sales],
DimDate[Date]
)
Sales QTD =
TOTALQTD(
[Total Sales],
DimDate[Date]
)
MTD برای بازه ماه جاری و QTD برای فصل جاری استفاده میشود. معنی دقیق «جاری» همیشه به Filter Context گزارش وابسته است.
۶.۶. فروش سال قبل
Sales Previous Year =
CALCULATE(
[Total Sales],
SAMEPERIODLASTYEAR(DimDate[Date])
)
حالا میتوانیم فروش دوره جاری را با همان دوره در سال قبل مقایسه کنیم.
۶.۷. رشد سالانه
YoY Growth % =
DIVIDE(
[Total Sales] - [Sales Previous Year],
[Sales Previous Year]
)
اگر فروش امسال ۱۲۰ و دوره مشابه سال قبل ۱۰۰ باشد، رشد ۲۰ درصد است. ولی این عدد باید کنار Context زمانی درست نمایش داده شود.
۶.۸. DATEADD؛ جابهجایی در زمان
DATEADD به ما اجازه میدهد Context زمانی را جلو یا عقب ببریم.
Sales Previous Month =
CALCULATE(
[Total Sales],
DATEADD(DimDate[Date], -1, MONTH)
)
با همین منطق میتوانیم دوره قبل را در سطح روز، ماه، فصل یا سال بررسی کنیم.
۶.۹. رشد ماهبهماه
MoM Growth % =
VAR CurrentSales = [Total Sales]
VAR PreviousSales = [Sales Previous Month]
RETURN
DIVIDE(
CurrentSales - PreviousSales,
PreviousSales
)
این Measure وقتی در نمودار ماهانه قرار میگیرد میتواند تغییر سرعت فروش را نشان دهد.
۶.۱۰. رشد مبلغی یا درصدی؟
فرض کن فروش از ۱۰۰ میلیارد به ۱۲۰ میلیارد رسیده است. رشد مبلغی ۲۰ میلیارد و رشد درصدی ۲۰٪ است.
Growth Amount = Current - Previous
Growth % = (Current - Previous) / Previous
در داشبورد مدیریتی معمولاً هر دو میتوانند مفید باشند؛ یکی اندازه تغییر و دیگری نسبت تغییر را نشان میدهد.
۶.۱۱. Rolling Average؛ روند را نرمتر ببین
فروش روزانه ممکن است بالا و پایین زیادی داشته باشد. میانگین متحرک کمک میکند روند کلی بهتر دیده شود.
Rolling 30D Sales Avg =
VAR Period =
DATESINPERIOD(
DimDate[Date],
MAX(DimDate[Date]),
-30,
DAY
)
RETURN
AVERAGEX(
Period,
CALCULATE([Total Sales])
)
این فقط یک الگوی آموزشی است؛ تعریف Rolling Average باید با Grain و نیاز کسبوکار هماهنگ شود.
۶.۱۲. Running Total
گاهی مدیر میخواهد ببیند فروش تجمعی در طول دوره چگونه رشد کرده است.
Running Sales =
CALCULATE(
[Total Sales],
FILTER(
ALLSELECTED(DimDate[Date]),
DimDate[Date] <= MAX(DimDate[Date])
)
)
Running Total برای مقایسه سرعت تحقق هدف در طول ماه یا سال بسیار کاربردی است.
۶.۱۳. مقایسه فروش تجمعی با هدف
اگر هدف سالانه یا ماهانه داشته باشیم، میتوانیم فروش تجمعی را کنار Target تجمعی قرار دهیم.
Gap to Target = [Sales YTD] - [Target YTD]
حالا مدیر فقط نمیبیند چقدر فروختهایم؛ میبیند نسبت به مسیر برنامه جلو هستیم یا عقب.
۶.۱۴. تاریخ سفارش یا تاریخ تحویل؟
یک فروش ممکن است چند تاریخ مهم داشته باشد: OrderDate، InvoiceDate و DeliveryDate. سؤال کسبوکار مشخص میکند کدام تاریخ باید مبنای تحلیل باشد.
Order Analysis → OrderDate
Delivery Analysis → DeliveryDate
با USERELATIONSHIP که فصل قبل دیدیم میتوانیم Measureهای جداگانه برای نقشهای زمانی مختلف بسازیم.
۶.۱۵. مقایسه Order و Delivery
Sales by Delivery Date =
CALCULATE(
[Total Sales],
USERELATIONSHIP(
FactSales[DeliveryDate],
DimDate[Date]
)
)
اختلاف بین فروش بر اساس سفارش و تحویل میتواند اطلاعات مهمی درباره backlog یا تأخیر عملیات بدهد.
۶.۱۶. تقویم شمسی؛ موضوع مهم پروژههای ایرانی
در پروژههای ایرانی معمولاً مدیر گزارش را با سال و ماه شمسی میخواهد. نکته مهم این است که نمایش شمسی و منطق Date Dimension را از هم جدا ببینیم.
برای تقویم شمسی باید ستونهای سال، ماه، شماره ماه و سایر ویژگیهای موردنیاز سازمان بهصورت منسجم طراحی شوند. تعریف سال مالی یا تقویم سازمان هم ممکن است با سال تقویمی یکسان نباشد.
نکته: Time Intelligence را بر اساس تعریف واقعی تقویم کسبوکار طراحی کن؛ صرفاً ظاهر تاریخ را عوض نکن.
۶.۱۷. Fiscal Year یا سال مالی
بعضی شرکتها سال مالی متفاوتی دارند. در این حالت YTD استاندارد باید با تعریف سال مالی سازمان هماهنگ شود.
قبل از پیادهسازی از واحد مالی بپرس: سال مالی از چه تاریخی شروع میشود؟ دورههای مالی چگونه تعریف شدهاند؟ گزارش مقایسهای بر چه مبنایی تأیید میشود؟
۶.۱۸. BLANK در دوره قبلی
اگر برای دوره قبل دادهای وجود نداشته باشد، Growth % میتواند BLANK شود. این الزاماً خطا نیست.
Growth % =
DIVIDE(
[Total Sales] - [Previous Sales],
[Previous Sales]
)
نباید بدون منطق کسبوکار BLANK را همیشه صفر نمایش دهیم؛ صفر و «دادهای نداریم» دو معنی متفاوتاند.
۶.۱۹. نمودار مناسب برای تحلیل زمانی
Line Chart معمولاً برای روند زمانی انتخاب خوبی است. Column Chart برای مقایسه دورهها مناسب است و KPI/Card برای نمایش خلاصه عملکرد استفاده میشود.
| سؤال | Visual پیشنهادی |
|---|---|
| روند فروش | Line Chart |
| ماه جاری در برابر قبل | Column/Bar |
| فروش تجمعی در برابر هدف | Line Chart |
| رشد درصدی | KPI/Card + Trend |
| جزئیات دورهها | Matrix |
۶.۲۰. سناریوی مدیریتی شرکت هانا
مدیرعامل میخواهد در یک صفحه ببیند فروش این ماه چقدر است، نسبت به ماه قبل و سال قبل چه تغییری داشته، YTD چقدر است و آیا از هدف عقب هستیم.
Current Sales
Previous Month Sales
MoM Growth %
Previous Year Sales
YoY Growth %
Sales YTD
Target YTD
Gap to Target
این مجموعه از KPIها داستان عملکرد را خیلی بهتر از یک Total Sales تنها تعریف میکند.
۶.۲۱. خطاهای رایج Time Intelligence
خطای اول: بدون Date Table استاندارد فرمولهای زمانی میسازیم.
خطای دوم: MonthName را بدون MonthNo مرتب میکنیم.
خطای سوم: تاریخ سفارش و تحویل را قاطی میکنیم.
خطای چهارم: Growth را وقتی دوره قبل صفر یا خالی است بدون بررسی نمایش میدهیم.
خطای پنجم: سال مالی سازمان را با سال تقویمی یکی فرض میکنیم.
خطای ششم: فقط درصد رشد را نشان میدهیم و اندازه واقعی تغییر را پنهان میکنیم.
۶.۲۲. Best Practiceهای تحلیل زمانی
یک Date Dimension مرکزی و قابل اعتماد داشته باش.
Measureهای پایه را دوباره استفاده کن.
Current، Previous و Growth را کنار هم تست کن.
تعریف دوره زمانی را با کسبوکار هماهنگ کن.
سال مالی و تقویم شمسی را از ابتدای پروژه مشخص کن.
Measureها را در مرز سال و ماه هم تست کن.
برای روندهای پرنوسان از Rolling Metric مناسب استفاده کن، نه برای پنهان کردن واقعیت.
۶.۲۳. تمرین پایه
برای شرکت هانا Measureهای Sales MTD، Sales QTD و Sales YTD را بساز و در Matrix کنار Year و Month قرار بده.
بررسی کن با تغییر Slicer تاریخ، نتایج چگونه تغییر میکنند.
۶.۲۴. تمرین متوسط
Sales Previous Month و MoM Growth % را بساز. یک Line Chart برای Total Sales و یک Card برای Growth % طراحی کن.
سه ماه با بیشترین افت را پیدا کن.
۶.۲۵. تمرین کاربردی
Sales Previous Year و YoY Growth % را بساز و فروش ماههای امسال را با دوره مشابه سال قبل مقایسه کن.
فقط عدد را گزارش نکن؛ حداقل سه فرضیه برای علت افت یا رشد بنویس.
۶.۲۶. تمرین چالشی
OrderDate و DeliveryDate را همزمان در مدل داشته باش. فروش بر اساس سفارش و فروش بر اساس تحویل را برای هر ماه مقایسه کن.
ماههایی را پیدا کن که فاصله این دو زیاد است و توضیح بده این اختلاف از نظر عملیاتی چه معنایی میتواند داشته باشد.
۶.۲۷. پروژه نهایی فصل؛ داشبورد تحلیل زمانی شرکت هانا
یک صفحه Executive Time Analysis بساز که مدیر در کمتر از ۱۵ ثانیه بتواند وضعیت زمانی فروش را بفهمد.
| بخش | خروجی |
|---|---|
| KPI | Total Sales |
| KPI | MoM Growth % |
| KPI | YoY Growth % |
| KPI | Sales YTD |
| KPI | Gap to Target |
| Chart | روند ماهانه |
| Chart | فروش تجمعی در برابر هدف |
| Filter | سال، ماه و شعبه |
در پایین صفحه یک جدول جزئیات ماهانه قرار بده تا کاربر بتواند Current Sales، Previous Month، Previous Year و Growth را کنار هم ببیند.
جمعبندی فصل ششم
در این فصل یاد گرفتیم زمان فقط یک ستون Date نیست؛ یکی از مهمترین ابعاد تحلیل کسبوکار است. با Date Table و Measureهای درست میتوانیم عملکرد فعلی را با گذشته، هدف و روند تجمعی مقایسه کنیم.
Current Period
↓
Previous Period / Previous Year
↓
Growth
↓
YTD / Running Total
↓
Target Comparison
↓
Business Insight
در فصل بعد وارد طراحی Visualها میشویم؛ یاد میگیریم برای هر سؤال چه نموداری انتخاب کنیم، چطور Card، Matrix، Slicer، Drill Down، Drill Through و Tooltip را طوری استفاده کنیم که گزارش هم زیبا باشد و هم واقعاً قابل استفاده.