روابط غیر فعال در Power BI
در این مطلب به بررسی روابط فعال و غیر فعال در Power BI خواهیم پرداخت. روابط یکی از مهم ترین عناصر موجود در Power BI هستند. در واقع این روابط هستند که تعامل بین نمودار ها را با هم برقرار می کنند.
مهمترین ویژگی موجود در Power BI تعاملی بودن نمودار ها، اسلایسر ها و … هستند. این تعامل از طریق روابط بین موجودیت ها صورت می پذیرد.
روابط در Power BI
روابط نقش بسیار مهمی در مدل های رابطه ای ایفا می کند. در واقع این روابط هستند که جداول را به یکدیگر مرتبط می سازند، اما در Power BI علاوه بر لینک کردن جداول وظیفه بسیار مهم فیلتر کردن نیز به عهده روابط است.
به مثال زیر توجه کنید. دو جدول فروش و مشتری را در نظر بگیرید.
در جدول مشتریان فیلد عنوان شغلی (EnglishOccupation) را مشاهده می کنید. حال می خواهیم ویژوالی ایجاد کنیم که تعداد فروش (Quantity) را به ازای هر مشتری نمایش دهد. کافی است از یک Stacked Column Chart استفاده کنیم و فیلد های عنوان شغلی و تعداد فروش را در آن استفاده کنیم. نمودار به شکل زیر نمایان خواهد شد.
همان طور که مشاهده می کنید همه اعداد برابر نمایش داده می شوند. دلیل این اتفاق برقرار نبودن رابطه بین دو جدول است. پس برای فیلتر کردن جداول باید حتما بین آن ها رابطه وجود داشته باشد.
خب برویم و این رابطه را ایجاد کنیم. روابط اصولا بین فیلد های مشترک جداول ایجاد می شود. فیلد مشترک این دو جدول CustomerKey است که باید این رابطه بر اساس این فیلد ایجاد گردد.
همان طور که مشاهده می کنید با درگ کردن فیلد های مشترک بر روی یکدیگر روابط ایجاد می شود. خب حال برگردیم و سری به نمودار بزنیم.
همان طور که مشاهده می کنید عملیات برش زدن اعداد به درستی صورت پذیرفته است و این فقط به دلیل وجود رابطه است. دقت کنید که جهت روابط در Power BI بسیار مهم است و از سمت یک به سمت چند رابطه حرکت می کند.
در واقع شما می توانید فیلدی از سمت یک رابطه (مشتری) را در محور نمودار قرار داده و تعداد فروش از سمت چند رابطه را برش بزنید. یا به عنوان مثال می توانید فیلدی از سمت یک رابطه (مانند کالا) را در اسلایسر قرار داده و میزان فروش (سمت چند) را برش بزنید. منظور از برش زذن همان فیلتر کردن است.
روابط غیر فعال در Power BI
باید توجه کنید که بین دو موجودیت تنها یک رابطه فعال می تواند وجود داشته باشد. در صورتی که بین دو جدول بیش از یک رابطه وجود داشته باشد، به طور خودکار یکی فعال و دیگری غیر فعال می شود.
به مثال زیر توجه کنید.
بین دو جدول DimDate و فروش دو رابطه وجود دارد. دلیل این اتفاق چیست؟ ما در جدول فروش فیلدی تحت عنوان تاریخ سفارش داریم. همچنین فیلدی به نام تاریخ حمل نیز وجود دارد. ما بر اساس هر یک از این دو فیلد می توانیم رابطه را ایجاد کنیم.
ما بر اساس هر دو فیلد این رابطه را ایجاد نمودیم. پس همان طور که پیش تر گفته شد یکی از روابط فعال و دیگری غیر فعال می شود. برویم و گزارشی ایجاد کنیم بر اساس میزان فروش در هر سال.
این گزارش نشان می دهد که ما در هر سال چه تعداد محصول فروختیم. آیا می توانیم نمایش دهیم که چه تعداد محصول در هر سال حمل شده است؟ در حال حاضر خیر! چرا که رابطه فعال ما بر اساس تاریخ سفارش ایجاد شده است.
پس برویم تغییری در مدل ایجاد کنیم. بر روی رابطه فعال دبل کلیک کنیم و آن را غیر فعال کنیم. کافی است گزینه مشخص شده در تصویر را غیر فعال کنید.
حال بر روی رابطه غیر فعال دبل کلیک کنید و آن را به حالت فعال در آورید.
همان طور که مشاهده می کنید حالا روابط فعال بر اساس تاریخ حمل است.
حال بدون هیچ تغییری به نمودار برگردیم. همان طور که مشاهده می کنید اعداد به کلی تغییر کرده است. حال اعداد نمایش میزان سفارش حمل شده در هر سال است نه میزان سفارش در هر سال.
اما این رویکرد مناسب است؟ مسلما خیر! ما برای هر گزارش باید روابط را فعال یا غیر فعال کنیم؟ قطعا خیر! دقت کنید که روابط غیر فعال هیچ گونه عملیات فیلتری را نمی توانند انجام دهند. پس کاربردشان چیست؟ کمی جلوتر خواهید فهمید!
Role Playing Dimension
اولین رویکرد ما به حل مساله استفاده از Role Playing Dimension است. به بعدی که با ساختار مشابه در نقش های مختلف به کار گرفته می شود Role Playing Dimension می گویند. اگر از جدول DimDate یک کپی تهیه کنیم و از آن در دو نقش استفاده کنیم به این بعد Role Playing Dimension گفته می شود.
کافی است با استفاده از زبان DAX یک جدول محاسباتی (Calculated Table) ایجاد کنیم. به طریق زیر عمل کنید. بر روی New Table کلیک کنید و با استفاده از دستور زیر یک کپی از جدول تهیه کنید.
همان طور که مشاهده می کنید یک جدول با ساختار کاملا مشابه با DimDate به مدل اضافه می شود.
حال رابطه بین دو جدول DimDate و فروش را بر اساس تاریخ سفارش و رابطه بین دو جدول ShipDate و فروش را بر اساس تاریخ حمل برقرار می کنیم.
حال می توانیم هر دو گزارش را به طور هم زمان و بدون دستکاری در روابط ایجاد کنیم. تنها تفاوت بین این دو گزارش در این است که در یکی سال از جدول DimDate انتخاب شده و در دیگری از جدول ShipDate.
نظر شما راجع به این روش چیست؟ من هم با نظر شما موافقم. شما کپی از یک جدول ایجاد می کنید. در واقع یک جدول واحد 2 بار در مدل شما به کار رفته است. این باعث هدر رفت Ram و فضا خواهد شد. این موضوع مخصوصا برای جداول بزرگ با چالش همراه خواهد بود.
اگر جدول بزرگی مثلا با چند میلیون ردیف دارید هرگز این کار را نکنید. پس راه حل بهتر چیست؟ USERELATIONSHIP!
تابع USERELATIONSHIP در زبان DAX
یکی از روش های دیگر برای استفاده از روابط غیر فعال در Power BI، استفاده از تابع USERELATIONSHIP است. این تابع به شما کمک می کند بدون دستکاری در مدل و البته تغییر در Measure روابط غیر فعال را تنها در محاسبه یک مژر خاص فعال کنید.
ابتدا کپی ایجاد شده را پاک کنید تا مطمئن شویم این روش ربطی به روش قبل ندارد. سپس رابطه ای غیر فعال بین DimDate و جدول فروش بر اساس تاریخ حمل ایجاد کنید. حال مدل به مدل اولیه تبدیل شد.
مدلی که در آن یک رابطه فعال بر اساس تاریخ سفارش و یک رابطه غیر فعال بر اساس تاریخ حمل وجود دارد.
حال یک مژر ایجاد کنیم که به سادگی تعداد فروش را محاسبه کند.
این مژر تعداد فروش را محاسبه می کند. حال ویژوالی ایجاد کنیم و تعداد فروش در هر سال را نمایش دهیم. حال مژر دیگری ایجاد می کنیم.
همان طور که مشاهده می کنیم از تابع USERELATIONSHIP باید به عنوان آرگومان تابع CALCULATE استفاده نمود. در واقع به تابع CALCULATE می گوییم جمع فروش را حساب کند اما موقع محاسبه دقت کند که رابطه فعال را بر اساس دو فیلد DateKey و ShipDateKey تنظیم شود.
یعنی فقط هنگام محاسبه این مژر به طور خودکار رابطه غیر فعال تبدیل یه یک رابطه فعال می شود و هیچ دستکاری در مدل صورت نمی پذیرد.
حال گزارش را با مژر های جدید ایجاد کنید.
استفاده از تابع USERELATIONSHIP بسیار ساده است. تنها چند نکته را باید به خاطر بسپرید. اول اینکه این تابع به عنوان آرگومان CALCULATE به کار می رود.
دوم اینکه کافی است فیلد های به کار برده شده در رابطه غیر فعال را به این تابع معرفی کنید. کافی است نشانگر ماوس را بر روی رابطه نگه دارید تا متوجه شوید این رابطه بر اساس چه فیلد هایی ایجاد شده است. همام طور که مشاهده می کندی این رابطه بر اساس DateKey و ShipDateKey ایجاد شده است.
توجه داشته باشید در معرفی این دو فیلد به تابع USERELATIONSHIP، ترتیب اهمیتی ندارد.
سوم اینکه دقت کنید برای استفاده از این تابع حتما باید رابطه غیر فعال بین دو جدول وجود داشته باشد.
این روش روش بهتری نسبت به روش قبل محسوب می شود. اگر چه این روش کار شما را برای نوشتن مژر زیاد می کند، اما خوشبختانه در مصرف Ram و فضا بهینه عمل می کند. همچنین مزیت دیگر این روش ایجاد گزارش های مقایسه ای است.
دقت کنید که در روش آخر توانستیم در یک ویژوال مقدار فروش در هر سال و میزان فروش حمل شده در هر سال را نمایش دهیم کاری که در روش های قبل امکان پذیر نبود.
نتیجه گیری
در این مطلب به بررسی نحوه استفاده از روابط غیر فعال در Power BI پرداختیم و به 2 روش Role Playing Dimension و همچنین استفاده از تابع USERELATIONSHIP در زبان DAX به حل مشکلات مربوط به این موضوع پرداختیم.
در روش Role Playing Dimension کار شما به عنوان یک کاربر برای نوشتن مژر ها ساده تر است، اما این روش باعث هدر رفت رم و فضا می شود. در روش دوم کار شما به عنوان کاربر برای اصلاح مژر ها کمی سخت تر خواهد شد اما باعث صرفه جویی در استفاده از رم و فضا خواهد شد و همچنین این روش امکان گزارش های مقایسه ای را فراهم می آورد.
به طور کلی توصیه ما به استفاده از روش دوم است.
همچنین مطالعه کنید:
درباره حسین وثوقی
دانش آموخته مهندسی صنایع و مدیریت فناوری اطلاعات دانشگاه تهران، علاقه مند به تحلیل و ارائه راه حل برای مسائل و بهینه سازی راه حل ها هستم ...
نوشته های بیشتر از حسین وثوقیمطالب زیر را حتما بخوانید
-
داده های نمونه و تمرینی برای یادگیری پاور بی آی | Power BI
431 بازدید
-
تنظیم مقدار پیش فرض اسلایسر تاریخ در Power BI
248 بازدید
-
دومین مسابقه بزرگ Power BI ایران
469 بازدید
-
نمونه پروژه داده های اقتصادی با Power BI
824 بازدید
-
نمونه پروژه قند مواد غذایی با Power BI
892 بازدید
-
اولین مسابقه طراحی داشبورد با Power BI
1.59k بازدید
بسیار عالی
ممنون از توضیحات کامل و جامعتان