زبان DAX (Data Analysis Expressions) قلب محاسبات در Power BI ،Power Pivot و SSAS Tabular است. اگرچه در نگاه اول شبیه فرمولهای اکسل به نظر میرسد، اما قدرت و پیچیدگی DAX بهمراتب بیشتر است. در پروژههای واقعی، وقتی نیاز به تحلیلهای چند بعدی، KPIهای پیچیده و گزارشهای پویا داریم، DAX پیشرفته وارد میدان میشود.
در این مقاله، بهصورت جامع و کاربردی، مفاهیم پیشرفته DAX را بررسی میکنیم؛ از Contextها (Row ,Filter ,Evaluation) گرفته تا توابع پیچیده مثل CALCULATE، FILTER، RANKX، EARLIER، TREATAS و Time Intelligence. هدف این است که شما بعد از مطالعه این متن، بتوانید مدلهای تحلیلی قدرتمند و بهینه در Power BI بسازید.
۱. مرور سریع بر مفاهیم پایه DAX
قبل از ورود به مباحث پیشرفته، باید پایهها را خوب بلد باشیم:
- Calculated Columns: محاسباتی که در سطح ردیف انجام میشوند و در مدل داده ذخیره میگردند.
- Measures: محاسباتی که در لحظه و بر اساس فیلترها اجرا میشوند (بهینهتر از ستونهای محاسباتی).
- Tables: جداول محاسباتی که میتوانند بر اساس توابعی مثل FILTER یا ADDCOLUMNS ساخته شوند.
۲. مفهوم Context در DAX
یکی از ستونهای اصلی درک DAX ،Context است. بدون فهم آن، نوشتن فرمولهای پیشرفته عملاً غیرممکن است.
۲.۱ Row Context
وقتی یک محاسبه روی هر ردیف اعمال میشود. مثلاً در ستون محاسباتی:
Total Price = Sales[Quantity] * Sales[UnitPrice]
۲.۲ Filter Context
زمانی که گزارش یا Visual با فیلترها محدود میشود. مثلاً وقتی کاربر سال ۲۰۲۴ را انتخاب میکند.
۲.۳ Evaluation Context
ترکیبی از Row و Filter Context. وقتی از توابعی مثل CALCULATE استفاده میکنیم، Context تغییر پیدا میکند.
۳. CALCULATE – قلب DAX پیشرفته
تابع CALCULATE مهمترین و پرکاربردترین تابع در DAX است، چون میتواند Context فیلتر را تغییر دهد.
Sales 2024 =
CALCULATE(
SUM(Sales[Amount]),
Sales[Year] = 2024
)
این تابع جمع فروش فقط برای سال ۲۰۲۴ را محاسبه میکند، حتی اگر کاربر سال دیگری انتخاب کرده باشد.
نکته کلیدی: CALCULATE همیشه ابتدا فیلترها را اعمال میکند و سپس محاسبه را انجام میدهد.
۴. Time Intelligence Functions (توابع هوش زمانی)
یکی از جذابترین کاربردهای DAX در تحلیلهای زمانی است.
- SAMEPERIODLASTYEAR → مقایسه با سال گذشته
- TOTALYTD → محاسبه سالبهتاریخ (Year-to-Date)
- DATESINPERIOD → انتخاب بازههای زمانی متحرک
Sales Last Year =
CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR('Date'[Date])
)
۵. توابع پیشرفته فیلترینگ
۵.۱ FILTER
برای ایجاد فیلترهای پیچیده روی دادهها:
High Value Customers =
CALCULATE(
COUNTROWS(Customers),
FILTER(Customers, Customers[Revenue] > 100000)
)
۵.۲ ALL و ALLEXCEPT
برای حذف یا کنترل فیلترها:
All Sales =
CALCULATE(
SUM(Sales[Amount]),
ALL(Sales)
)
۵.۳ TREATAS
انتقال فیلتر از یک جدول به جدول دیگر:
Sales by Custom Mapping =
CALCULATE(
SUM(Sales[Amount]),
TREATAS(VALUES(Mapping[CustomRegion]), Sales[Region])
)
۶. EARLIER و EARLIEST
این توابع زمانی به کار میروند که نیاز به رجوع به ردیف قبلی در Row Context داشته باشیم.
مثال: رتبهبندی بر اساس فروش هر مشتری:
Rank by Customer =
RANKX(
FILTER(Sales, Sales[CustomerID] = EARLIER(Sales[CustomerID])),
Sales[Amount]
)
۷. توابع رتبهبندی و مقایسه
RANKX
برای رتبهبندی مقادیر:
Customer Rank =
RANKX(ALL(Customers), SUM(Sales[Amount]), , DESC)
TOPN
برای انتخاب N رکورد برتر:
Top 5 Products =
TOPN(5, SUMMARIZE(Products, Products[Name], "Sales", SUM(Sales[Amount])), [Sales], DESC)
۸. Advanced Table Functions
- SUMMARIZE → ساخت جداول گروهبندیشده
- ADDCOLUMNS → افزودن ستونهای محاسباتی به جدول
- GENERATE → ایجاد ترکیب از دو جدول
Customer Product Sales =
SUMMARIZE(
Sales,
Customers[Name],
Products[Name],
"Total Sales", SUM(Sales[Amount])
)
۹. بهینهسازی DAX
وقتی مدل دادهها و گزارشها سنگین میشوند، سرعت اجرا اهمیت زیادی پیدا میکند. نکات مهم:
- استفاده از Measures به جای Calculated Columns
- حذف فیلترهای غیرضروری با ALL یا REMOVEFILTERS
- استفاده از Variables برای خوانایی و عملکرد بهتر
Profit Margin =
VAR TotalSales = SUM(Sales[Amount])
VAR TotalCost = SUM(Sales[Cost])
RETURN
DIVIDE(TotalSales - TotalCost, TotalSales)
۱۰. کاربردهای واقعی DAX پیشرفته
- محاسبه KPIهای پیچیده (سود تجمعی، رشد نسبت به سال قبل، میانگین متحرک)
- طراحی Dynamic Segmentation (دستهبندی مشتریان بر اساس رفتار خرید)
- ساخت What-if Analysis (تحلیل سناریوها با پارامترهای پویا)
- طراحی داشبوردهای مالی، منابع انسانی و عملیات با معیارهای چندسطحی
سوالات متداول (FAQ)
۱. آیا استفاده زیاد از Calculated Columns خوب است؟
خیر، چون مدل داده را سنگین میکند. بهتر است بیشتر از Measures استفاده شود.
۲. چه زمانی باید از TREATAS استفاده کنیم؟
وقتی میخواهیم ارتباط منطقی بین دو جدول بسازیم که رابطه فیزیکی ندارند.
۳. EARLIER هنوز در نسخههای جدید کاربرد دارد؟
بله، ولی در بسیاری از موارد میتوان از VAR و CALCULATE استفاده کرد که سادهتر و بهینهترند.
۴. برای افزایش سرعت DAX چه کنیم؟
مدل داده را ساده نگه دارید، ستونهای اضافه را حذف کنید و از متغیرها (VAR) استفاده کنید.
۵. کدام تابع DAX پرکاربردترین است؟
بدون شک CALCULATE چون امکان تغییر Context و اجرای محاسبات پیچیده را میدهد.
منابع و مقالات
برای اطلاعات بیشتر و مطالعه تخصصی میتوانید به منابع زیر مراجعه کنید:
- کتاب “Definitive Guide to DAX” نوشته Marco Russo و Alberto Ferrari
- مرجع زبان DAX افزونه کوئری نویسی در اکسل و POWER BI
- مرجع زبان فرمول نویسی M در پاور کوئری
- طراحی داشبوردهای مدیریتی در Microsoft Power BI
تماس و مشاوره با لاندا
شرکت توسعه فناوری اطلاعات لاندا با تخصص در Power BI، مدلسازی داده و طراحی داشبوردهای هوش تجاری، آماده است تا برای سازمان شما:
- مدلهای تحلیلی پیشرفته طراحی کند.
- KPIها و محاسبات پیچیده را با DAX توسعه دهد.
- داشبوردهای سریع و بهینه تحویل دهد.
همین حالا با لاندا تماس ✆ بگیرید تا دادههای خام شما به بینشهای واقعی و ارزشمند تبدیل شوند.
نظری داده نشده