DAX Data Lineage چیست-آموزش تابع TREATAS در Power BI-ایجاد روابط مجازی در DAX-تفاوت TREATAS و USERELATIONSHIP-فیلتر کردن داده‌ها در Power BI بدون رابطه-TREATAS در DAX-آموزش TREATAS-چیست-روابط مجازی در DAX-USERELATIONSHIP-مدل‌سازی Power BI-فیلتر مجازی DAX-تحلیل داده در پاور بی آی

در دنیای تحلیل داده و مدل‌سازی در Power BI، توابع DAX نقش کلیدی در ساخت گزارش‌های هوشمند و تصمیم‌گیرنده دارند. یکی از مفاهیم پیشرفته اما کمتر شناخته‌شده در این حوزه، Data Lineage یا «تبار داده» است که درک آن می‌تواند نحوه انتقال فیلترها بین جداول را متحول کند. در کنار آن، تابع قدرتمند TREATAS این امکان را فراهم می‌کند تا حتی بدون رابطه فیزیکی، داده‌ها را به‌طور مجازی به یکدیگر متصل کنیم. در این مقاله، به‌صورت جامع به بررسی این دو مفهوم می‌پردازیم، کاربردهای آنها را تحلیل می‌کنیم و با مثال‌های عملی در محیط Power BI، عمق عملکرد آنها را روشن خواهیم ساخت.

Data Lineage در DAX

Data Lineage یا «تبارداده» در DAX به معنای ردیابی منبع اصلی داده‌ها در مدل داده‌ای است. هر ستون در یک جدول DAX دارای یک برچسب تبار است که مشخص می‌کند داده‌های آن از کدام ستون اصلی در مدل استخراج شده‌اند. این ویژگی به DAX اجازه می‌دهد تا فیلترها را به‌درستی از طریق روابط بین جداول منتقل کند.

چرا Data Lineage مهم است؟

– تضمین صحت فیلترها در محاسبات
– جلوگیری از خطاهای تحلیلی در مدل‌های پیچیده
– امکان استفاده از توابعی مانند TREATAS برای بازسازی تبار داده

تابع TREATAS در DAX

تابع TREATAS یکی از توابع پیشرفته DAX است که برای ایجاد روابط مجازی بین جداول استفاده می‌شود. این تابع با مقادیر یک ستون طوری رفتار می‌کند که گویی متعلق به ستونی دیگر در جدول متفاوت هستند.

TREATAS(<table_expression>, <column1>, [<column2>], …)

کاربردهای رایج TREATAS

کاربردتوضیح
ایجاد روابط مجازیزمانی که رابطه فیزیکی بین جداول وجود ندارد و نیاز به فیلتر کردن داده‌ها داریم.
مقایسه بودجهنگاشت داده‌های بودجه‌ای (مثلاً ماهانه) به داده‌های واقعی (مثلاً روزانه) برای تحلیل دقیق‌تر
جایگزینی USERELATIONSHIPزمانی که چند رابطه بین دو جدول وجود دارد و نمی‌خواهیم از USERELATIONSHIP استفاده کنیم.
فیلتر کردن با جدول Lookup غیرمرتبطاعمال فیلتر از جدولی که به‌صورت مستقیم به جدول هدف متصل نیست.
تحلیل مشتریان یا محصولات خاصفیلتر کردن فروش یا رفتار مشتریان بر اساس ویژگی‌هایی که در جدول دیگری ذخیره شده‌اند.
نگاشت چند ستون هم‌زماناستفاده از SUMMARIZE یا SELECTCOLUMNS برای نگاشت ترکیبی چند ستون بین جداول

مزایای استفاده از TREATAS

– انعطاف‌پذیری بالا در مدل‌سازی داده‌ها
– سادگی در نگهداری مدل بدون نیاز به روابط فیزیکی اضافی
– افزایش خوانایی کد DAX در برخی سناریوها
– حفظ تبار داده در خروجی‌ها

معایب و محدودیت‌ها

– فقط در زمینه فیلتر (Filter Context) کار می‌کند (مثلاً داخل CALCULATE)
– رابطه واقعی ایجاد نمی‌کند و در مدل قابل مشاهده نیست.
– ممکن است در مدل‌های بزرگ کاهش عملکرد ایجاد کند.
– نیاز به مستندسازی دقیق برای جلوگیری از ابهام

چه زمانی از TREATAS استفاده کنیم یا نکنیم؟

وضعیتاستفاده کنیم؟توضیح
بین دو جدول رابطه فیزیکی وجود ندارد.TREATAS امکان ایجاد فیلتر مجازی را فراهم می‌کند.
چند رابطه بین دو جدول وجود دارد و فقط یکی باید فعال باشد.

جایگزین مناسبی برای USERELATIONSHIP است.
نیاز به نگاشت چند ستون هم‌زمان داریم.

با SUMMARIZE یا SELECTCOLUMNS قابل ترکیب است.
مدل داده ساده و روابط مشخص دارد.

استفاده از روابط فیزیکی ساده‌تر و سریع‌تر است.
عملکرد (Performance) بسیار مهم است.

TREATAS ممکن است کندتر از روابط فیزیکی باشد.
نیاز به فیلتر کردن از طریق جدول واسط داریم.

در سناریوهای پیچیده مانند فیلتر از جدول Lookup مفید است.
نیاز به فیلتر پویا بر اساس انتخاب کاربر داریم.

می‌توان با TREATAS فیلترهای داینامیک ساخت
می‌خواهیم فیلتر در مدل قابل مشاهده باشد.

TREATAS فقط در زمان اجرا عمل می‌کند و در مدل دیده نمی‌شود.

در یک جمله: اگر رابطه فیزیکی ممکن و ساده است، از آن استفاده کن. اگر نه، TREATAS ابزار قدرتمند توست.

نمونه‌های استفاده

مثال ۱: فیلتر کردن فروش بر اساس منطقه فروش کارمندان

در مدل AdventureWorks، جدول DimEmployee شامل ستون SalesTerritoryRegion است، اما این جدول به‌طور مستقیم به FactResellerSales متصل نیست.

با استفاده از TREATAS می‌تونیم فروش‌هایی رو ببینیم که توسط کارمندانی در یک منطقه خاص انجام شده:

SalesAmountByEmployeeRegion :=
CALCULATE(
SUM(FactResellerSales[SalesAmount]),
TREATAS(
VALUES(DimEmployee[SalesTerritoryRegion]),
DimSalesTerritory[SalesTerritoryRegion]
)
)

این فرمول فروش را فقط در مناطقی محاسبه می‌کند که کارمندان آن منطقه در فیلتر قرار دارند.

مثال ۲: مقایسه فروش واقعی با بودجه در سطح ماه

فرض کن جدول بودجه (Budget) فقط شامل تاریخ‌های ماهانه است، اما فروش در سطح روزانه ثبت شده. برای نگاشت صحیح:

BudgetedSales :=
CALCULATE(
SUM(Budget[Amount]),
TREATAS(
VALUES(DimDate[FullDateAlternateKey]),
Budget[Date]
)
)

مثال ۳: جایگزینی برای USERELATIONSHIP بین تاریخ ارسال و تاریخ سفارش

در FactInternetSales دو ستون تاریخ داریم: OrderDate و ShipDate. اگر بخواهیم فروش را بر اساس تاریخ ارسال ببینیم:

SalesByShipDate :=
CALCULATE(
SUM(FactInternetSales[SalesAmount]),
TREATAS(
VALUES(DimDate[FullDateAlternateKey]),
FactInternetSales[ShipDate]
)
)

مثال ۴: فیلتر کردن فروش بر اساس کشور مشتری از جدول غیرمرتبط

اگر DimGeography شامل کشورها باشد و بخواهیم فروش را فقط برای کشور خاصی ببینیم:

SalesByCountry :=
CALCULATE(
SUM(FactInternetSales[SalesAmount]),
TREATAS(
VALUES(DimGeography[CountryRegionName]),
DimCustomer[CountryRegionName]
)
)

ترکیب TREATAS با دیگر توابع DAX

CALCULATE

مهم‌ترین تابعی که TREATAS درون آن استفاده می‌شود. چون TREATAS فقط در زمینه فیلتر (Filter Context) عمل می‌کند، باید درون CALCULATE یا CALCULATETABLE قرار گیرد.

CALCULATE(
[Total Sales],
TREATAS(VALUES(DimDate[Month]), FactSales[Month])
)

 VALUES

برای استخراج مقادیر یکتا از یک ستون جهت استفاده در TREATAS:

TREATAS(VALUES(DimProduct[Category]), FactSales[Category])

SUMMARIZE

زمانی که نیاز به نگاشت چند ستون به‌صورت هم‌زمان داریم، SUMMARIZE برای ساخت جدول ترکیبی استفاده می‌شود:

TREATAS(
SUMMARIZE(DimCustomer, DimCustomer[Country], DimCustomer[City]),
FactSales[Country], FactSales[City]
)

SELECTCOLUMNS

برای ساخت جدول سفارشی با ستون‌های خاص جهت استفاده در TREATAS:

TREATAS(
SELECTCOLUMNS(DimEmployee, “Region”, DimEmployee[SalesTerritoryRegion]),
DimSalesTerritory[SalesTerritoryRegion]
)

CROSSJOIN یا UNION

در سناریوهای پیچیده‌تر، می‌توان از CROSSJOIN یا UNION برای ساخت جدول ترکیبی استفاده کرد و سپس آن را به TREATAS داد.

FILTER یا ALL

برای کنترل دقیق‌تر زمینه فیلتر، می‌توان از FILTER یا ALL در کنار TREATAS استفاده کرد:

CALCULATE(
[Total Sales],
ALL(DimDate),
TREATAS(VALUES(DimDate[Year]), FactSales[Year])
)

نکته کلیدی: TREATAS را باید آگاهانه، مستند و در موارد ضروری به کار برد، و همواره درک درستی از جریان داده (Data Lineage) در پشت‌ صحنه داشته باشیم.

اگر به‌دنبال طراحی مدل‌های حرفه‌ای، پویا و انعطاف‌پذیر هستید، وقت آن است که TREATAS را به جعبه‌ابزار DAX خود اضافه کنید.

سناریوی تحلیل فروش بر اساس منطقه فروش کارمندان (بدون رابطه مستقیم)

در مدل AdventureWorksDW، جدول‌های زیر وجود دارند:

– FactResellerSales: شامل اطلاعات فروش
– DimEmployee: شامل اطلاعات کارمندان
– DimSalesTerritory: شامل اطلاعات منطقه فروش

اما بین DimEmployee و DimSalesTerritory رابطه مستقیم وجود ندارد. حالا فرض کن می‌خواهیم فروش‌هایی را محاسبه کنیم که توسط کارمندانی در منطقه خاصی (مثلاً “Northwest”) انجام شده‌اند.

گام‌های پیاده‌سازی در Power BI

۱. ساخت جدول فیلترشده از کارمندان منطقه Northwest:

SelectedRegions :=
VALUES(
FILTER(
DimEmployee,
DimEmployee[SalesTerritoryRegion] = “Northwest”
)[SalesTerritoryRegion]
)

۲. استفاده از TREATAS برای اعمال فیلتر روی فروش:

SalesByEmployeeRegion :=
CALCULATE(
SUM(FactResellerSales[SalesAmount]),
TREATAS(
SelectedRegions,
DimSalesTerritory[SalesTerritoryRegion]
)
)

این فرمول باعث می‌شود که فیلتر منطقه از جدول DimEmployee به جدول DimSalesTerritory منتقل شود و در نتیجه فقط فروش‌های مرتبط با آن منطقه محاسبه شوند.

نکات مهم:

– این سناریو زمانی مفید است که رابطه فیزیکی بین جداول وجود ندارد یا ایجاد آن ممکن نیست.
– TREATAS در اینجا نقش پل ارتباطی مجازی بین DimEmployee و FactResellerSales را ایفا می‌کند.
– می‌توان این سناریو را برای تحلیل‌های مشابه مثل مقایسه فروش بر اساس نقش کارمند، کشور مشتری یا دسته‌بندی محصول نیز گسترش داد.

نتیجه گیری

در پایان، می‌توان گفت که درک صحیح از مفهوم Data Lineage و تسلط بر استفاده‌ هوشمندانه از تابع TREATAS در DAX، می‌تواند به‌طور چشمگیری کیفیت مدل‌سازی داده‌ها و دقت تحلیل‌ها در Power BI یا SSAS Tabular را افزایش دهد.

TREATAS ابزاری بی‌نهایت قدرتمند است برای زمانی که روابط فیزیکی بین جداول محدود یا غیرممکن هستند. این تابع با بهره‌گیری از تبار داده، امکان ایجاد فیلترهای مجازی، تحلیل‌های ترکیبی، و کنترل دقیق روی context محاسباتی را فراهم می‌کند. اما در عین حال، استفاده ناصحیح یا بیش از حد آن می‌تواند باعث افت عملکرد یا ابهام در مدل شود.

پرسش‌های پرتکرار (FAQ)

۱. آیا TREATAS جایگزین روابط فیزیکی است؟
خیر، فقط در زمان اجرا رابطه مجازی ایجاد می‌کند و در مدل قابل مشاهده نیست.

۲. آیا TREATAS باعث کاهش عملکرد می‌شود؟
در مدل‌های بزرگ یا پیچیده ممکن است باعث کاهش سرعت شود، به‌خصوص اگر به‌درستی استفاده نشود.

۳. آیا می‌توان از TREATAS در Excel هم استفاده کرد؟
بله، از نسخه ۱۸۰۹ به بعد در Excel پشتیبانی می‌شود، اما ممکن است در IntelliSense نمایش داده نشود.

۴. آیا TREATAS تبار داده را تغییر می‌دهد؟
بله، این تابع می‌تواند تبار داده را به ستون مقصد منتقل کند، که برای فیلتر کردن بسیار مهم است.

 

پیشنهاد مطالعه

  1. مرجع زبان DAX افزونه کوئری نویسی در اکسل و POWER BI
  2. مرجع زبان فرمول نویسی M در پاور کوئری

  3. طراحی داشبوردهای مدیریتی در Microsoft Power BI

 

ارتباط و مشاوره

برای اطلاعات بیشتر و مشاوره می‌توانید از طریق زیر با ما در ارتباط باشید:

  • تماس  با شرکت لاندا برای مشاوره، اجرا و یا آموزش تخصصی.

نظری داده نشده

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *