آموزش Power BI صفر تا سکو : قسمت هفتم ( نوشتن Measure )
با 6 قسمت از سریال آموزشی Power BI صفر تا سکو با شما همراه بودیم. اکنون با قسمت هفتم این سریال در خدمت شما عزیزان هستیم. در این مطلب به آموزش نحوه نوشتن Measure با استفاده از DAX خواهیم پرداخت.
DAX و مدل سازی دو بال پرواز شما به عنوان یک توسعه دهنده داشبورد با استفاده از نرم افزار Power BI هستند. پس سعی کنید هر دوی آن ها را به خوبی فرا گیرید. اگر هنوز موفق به مطالعه قسمت های قبل نشدید ابتدا آن ها را مطالعه کنید.
نکات کلیدی
برخی از نکات هستند که باید قبل از شروع به یادگیری DAX و نوشتن Measure از آن ها آگاه باشید.
ممکن است شما کاربر اکسل بوده باشید و اکنون تمایل به یادگیری Power BI دارید. باید این نکته را بدانید که در Power BI امکان کار با سلول وجود ندارد. شما تنها می توانید با ستون ها و جداول کار کنید. در واقع فرمول های موجود در DAX از شما به عنوان آرگومان، ستون یا جدول درخواست می کنند.
خروجی توابع موجود در DAX گاهی تک مقدار و گاهی جدول است. شما می توانید از توابعی که خروجی آن ها جدول است به عنوان ورودی توابع دیگر استفاده کنید.
نوشتن Measure در DAX
شما می توانید به 2 روش ضمنی و صریح به ایجاد مژر بپردازید. با هم به بررسی انواع روش های نوشتن Measure بپردازیم.
ایجاد Measure ضمنی (Implicit Measure)
برای ایجاد مژر ضمنی کافیست فیلد (ستون) مورد نظر را Drag & Drop کرده و در موقعیت مناسب قرار دهید. به طور مثال از ویژوال ها، Card را انتخاب نموده و ستون تعداد (OrderQuantity) را در قسمت Field قرار می دهیم. همچنین با تیک زدن فیلد مورد نظر، معمولا فیلد جای مناسب خود را پیدا می کند (حداقل در مورد Card اینگونه است). همان طور که در تصویر مشاهده می کنید عدد 60k یا همان 60000 در تصویر نقش می بندد.
در واقع Engine خود مژری برای این ستون ایجاد می کند و عمل تجمیع را برای آن انجام می دهد. زبانه مشخص شده در تصویر زیر را باز کنید.
باکسی مطابق تصویر پیش روی شما باز می شود.
همان طور که مشاهده می کنید به صورت پیش فرض بر روی SUM قرار گرفته و تعداد فروش را جمع کرده است. شما می توانید آن را بر روی میانگین (AVERAGE)، ماکسیمم (MAXIMUM)، مینیمم (MINIMUM) و … قرار دهید. شما با این کار به ساخت یک مژر ضمنی اقدام می کنید. این روش برای ساخت مژر های ساده مناسب است.
ایجاد Measure صریح (Explicit)
با هم به مرور نحوه نوشتن Measure بپردازیم. Power BI را باز کنید. به دو روش می توانید Measure مد نظرخود را ایجاد کنید. بر روی جدولی که می خواهید مژر در آن ساخته شود کلیک راست کنید و New Measure را انتخاب کنید.
یا از تب Modeling، مطابق تصویر New Measure را انتخاب نمایید. توجه داشته باشید در ساخت Measure هیچ تفاوتی نمی کند که آن را در کدام جدول ایجاد کنید.
حال در قسمت مشخص شده نام مد نظر خود را قبل از علامت مساوی تایپ نمایید. بعد از علامت مساوی نیز می توانید فرمول مد نظر خود را تایپ نمایید.
همان طور که مشاهده می نمایید نام Sales را برای مژر خود انتخاب نموده ایم.
حال پس از علامت مساوی می توانیم فرمول خود را نوشته و مژر مورد نظر خود را ایجاد نماییم. به محض اینکه شروع به تایپ نمودید لیستی از توابع پیش روی شما نمایش داده می شود که می توانید تابع مد نظر خود را انتخاب نمایید. با انتخاب هر کدام از توابع توضیحی از آن تابع در کنار آن ظاهر می شود.
همان طور که مشاهده می کنید با تایپ SU لیست تمام توابعی که با این حروف آغاز می شوند به شما نمایش داده می شود. همچنین همان طور که مشاهده می کنید با رفتن به روی هر تابع توضیحات آن ارائه می شود. به طور مثال توضیحات SUM را مشاهده می کنید که جمع مقادیر یک ستون است.
توجه داشته باشید که دکمه Enter به معنای اتمام و تایید کد است. پس از دکمه Enter تنها پس از اتمام فرمول استفاده نمایید. برای انتخاب تابع مورد نظر و همچنین رفتن به خط بعد از کلید Tab استفاده نمایید. به محض فشردن کلید Tab بر روی تابع مورد نظر، تابع به طور کامل نوشته شده و راهنمای آن تابع رویت می شود.
این راهنما نوع و ترتیب ورودی ها را نمایش می دهد. همچنین لیستی از ورودی های مجاز در داده های شما را نمایش می دهد که شما می توانید آن را انتخاب نمایید. همان طور که قابل مشاهده است تابع SUM تنها به یک ورودی و آن هم از نوع ستون نیاز دارد.
اگر یکی از ستون های عددی را انتخاب نمایید عمل جمع بر روی آن ستون صورت می پذیرد. ما ستون تعداد خرید (Quantity) را به عنوان ورودی به تابع معرفی کردیم. به محض شروع به تایپ نام ستون، لیستی از ستون ها که با آن حروف شروع می شوند به شما نمایش داده می شود.
با کلید Tab ستون مد نظرتان را انتخاب نموده و پرانتز را ببندید.
حال مژر مورد نظر ایجاد شده و قابل استفاده است. چگونه می توان نتیجه مژر ایجاد شده را مشاهده نمود؟ توجه کنید که نتیجه مژر به صورت فیزیکی در مدل ذخیره نمی شود. نتیجه مژر تنها با ایجاد Context قابل مشاهده است.
شما با استفاده از یک Card می توانید یک Context ایجاد کنید. کافیست Card را انتخاب نموده تا بر روی صفحه پدیدار شود. سپس مژر خود را در قسمت Field قرار دهید. همان طور که مشاهده می کنید عدد 60000 بر روی صفحه نقش می بندد که نشان دهنده این است که فروش ما 60 هزار عدد بوده است.
حال می توانیم یک Slicer بر روی صفحه قرار دهیم و به وسیله آن Context را تغییر دهیم. کافیست Slicer را انتخاب نموده و فیلد مورد نظر خود را در آن قرار دهید. بدین ترتیب لیستی از مقادیر موجود در ستون نمایش داده می شود. ما ستون Year را انتخاب نموده و در اسلایسر قرار دادیم. لیست سال ها به ما نمایش داده شده است.
ما می توانیم به راحتی سال مورد نظر خود را تغییر داده و در واقع Context را تغییر دهیم. از اسلایسر سال را انتخاب می نماییم. در واقع با این کار Context را تغییر داده ایم. همان طور که متوجه شدید عدد تعداد فروش به 2216 تغییر یافته که نشان دهنده فروش در سال 2011 می باشد.
حال بهتر متوجه مفهوم Context می شوید. پس بار دیگر این نکته قابل ذکر است که مژر با توجه به Context معنا و مفهوم می یابد و با تغییر Context نتیجه آن تغییر می یابد.
نکاتی درمورد نوشتن کدهای DAX
برخی نکات جود دارند که بهتر است آن ها را در نوشتن measure ها رعایت کنید. نکته مهمی که باید به آن توجه شود نوشتن نام جدول قبل از ستون است. همان طور که مشاهده می کنید ابتدا باید نام جدول نوشته شود و سپس نام ستون در براکت قرار گیرد.
نکته مهم دیگر در مورد نوشتن Measure این است که حتما و حتما باید در نوشتن آن ها از توابع تجمیعی استفاده شود. همان طور که در تصویر مشاهده می کنید سعی کردیم مژری بدون استفاده از توابع تجمیعی بنویسیم که با خطا مواجه شدیم.
همان طور که در متن خطا مشاهده می کنید گفته شده که اعداد زیادی برای این ستون در جدول وجود دارند و این مژر قادر به برگرداندن یکی از آن ها به عنوان خروجی نهایی نیست. در متن خطا گفته شده که این اتفاق می تواند هنگامی صورت پذیرد که شما بدون استفاده از تابع تجمیعی (Aggregation Function) از یک ستون استفاده نمایید.
برای رفع این خطا کافیست از یک تابع تجمیعی استفاده کنیم. به طور مثال عمل تجمیع را با استفاده از تابع SUM بر روی این ستون انجام دهیم.
توابع زیادی برای تجمیع در DAX موجود هستند که ساده ترین آن ها عبارتند از:
SUM
AVERAGE
MAX
MIN
COUNT
صریح یا ضمنی؟!
ممکن است این سوال پیش بیاید که مژر های صریح از عملکرد بهتری برخوردارند یا مژر های ضمنی؟ آیا مژر ها را به صورت ضمنی ایجاد کنیم یا نوشتن Measure را به صورت صریح انتخاب کنیم؟ پاسخ این است که تفاوتی در عملکرد آن ها وجود ندارد. مژر های ضمنی مژرهای بسیار ساده ای هستند که نوشتن آن ها به صورت صریح نیز به همان سادگی است!
اما معمولا مژر های مد نظر ما به این سادگی ها نیستند و نمی توان آن ها را به صورت ضمنی ایجاد کرد. به یک مثال ساده توجه کنید. فرض کنید می خواهیم میزان فروش را به دست آوریم (توجه کنید میزان فروش مد نظر است نه تعداد فروش). این محاسبه از ضرب تعداد فروش رفته در هر فاکتور در قیمت واحد به دست می آید. اگر بخواهیم این مژر را به صورت ضمنی ایجاد کنیم باید به صورت زیر عمل کنیم.
ابتدا یک ستون محاسباتی در جدول Sales ایجاد کنیم و برای هر ردیف این حال ضرب را انجام دهیم. حتما می دانید که ستون محاسباتی بر خلاف مژر باید در جدول مورد نظر ایجاد شود. در واقع اگر قصد ایجاد این ستون در جداول دیگر را داشته باشید به ستون های جدول Sales دسترسی نخواهید داشت. پس مطابق تصویر جدول Sales را انتخاب نمایید و سپس New Column را انتخاب نمایید. یا بر روی جدول کلیک راست کرده و New Column را انتخاب نمایید.
حال می توانید نام مورد نظر خود را نوشته و پس از علامت مساوی فرمول مد نظر خود را بنویسید. همان طور که می دانید ستون های محاسباتی ردیف به ردیف محاسبه می شوند. پس بر خلاف مژر ها نیازی به تجمیع ندارند. به مثال زیر توجه کنید. یک ستون جدید ایجاد کردیم با نام LineAmount که در هر ردیف تعداد در قیمت ضرب شده است.
ستون آخر نشان دهنده نتیجه این فرمول است.
اگر همین فرمول را به عنوان مژر بنویسیم با خطا مواجه خواهیم شد و حتما باید تجمیع بر روی آن صورت پذیرد.
حال می توانیم با استفاده از این ستون مژر ضمنی خود را ایجاد کنیم. کافیست ستون ایجاد شده را در قسمت فیلد قرار دهیم. همان طور که مشاهده می کنید عدد 29 میلیون دلار در تصویر نمایش داده می شود. در واقع این مژر ضمنی کل اعداد موجود در ستون LineAmount را با هم جمع می کند.
اما آیا این روش مناسب است؟ قطعا خیر! ستون محاسباتی به طور فیزیکی در مدل ذخیره می شود و باعث کاهش عملکرد مدل می شود. بهتر است تا حد امکان از ایجاد ستون محاسباتی جلوگیری کنید. پس راه حل چیست؟ استفاده از مژر های صریح.
درست است که تابع SUM تنها و تنها یک ستون را به عنوان وروی می پذیرد اما تابع SUMX می تواند کاستی های این تابع را پوشش دهد. با این تابع دیگر لازم نیست ستون محاسباتی ایجاد کنید، بلکه به صورت زیر عمل می کنید. یک مژر جدید ایجاد می کنید. تابع SUMX یک جدول و یک فرمول به عنوان ورودی دریافت می کند.
جدول مورد نظر خود (FactSales) را به عنوان آرگومان اول و ضرب تعداد در قیمت را به عنوان فرمول به تابع معرفی می کنیم. در تصویر زیر مژر مورد نظر را مشاهده می کنید. این روش نتیجه ای مشابه روش قبل دارد ولی دارای عملکرد بهتری است.
حال با نحوه نوشتن Measure ها و نکات مربوط به آن ها آشنا شدید. در مطالب آینده بیشتر به مباحث DAX خواهیم پرداخت. اگر پیشنهاد یا انتقادی در مورد این مطالب دارید حتما با ما در میان بگذارید.
درباره حسین وثوقی
دانش آموخته مهندسی صنایع و مدیریت فناوری اطلاعات دانشگاه تهران، علاقه مند به تحلیل و ارائه راه حل برای مسائل و بهینه سازی راه حل ها هستم ...
نوشته های بیشتر از حسین وثوقیمطالب زیر را حتما بخوانید
-
داده های نمونه و تمرینی برای یادگیری پاور بی آی | Power BI
430 بازدید
-
تنظیم مقدار پیش فرض اسلایسر تاریخ در Power BI
247 بازدید
-
دومین مسابقه بزرگ Power BI ایران
468 بازدید
-
نمونه پروژه داده های اقتصادی با Power BI
823 بازدید
-
نمونه پروژه قند مواد غذایی با Power BI
891 بازدید
-
اولین مسابقه طراحی داشبورد با Power BI
1.58k بازدید
[…] قسمت هفتم آموزش Power … […]
سلام
خیلی مطالب خوبی ارائه دادی .
دستت درد نکنه
منم ی صنایعی هستم.
مرسی
سلام
ممنون از لطف شما
سلام علیکم. یه سوال داشتم خدمتتون. من تعدادی محصول دارم که تعداد فروش و همچنین مبلغ کل فروش هرکدام از محصول ها را دارم اگه بخوام مژری بسازم که رتبه هر محصول را نمایش بده چه کنم؟ لطفا راهنمایی کنید.
ممنونم
سلام
RANKX(ALL(Product),[Forosh])
سلام ممنون از آموزش خوبتان.
امکان دارد که فایلهای اکسل جداول را در اختیار مان قرار دهید تا گام به گام با شما پیش برویم؟
سلام
ارسال شد
سلام من یک جدول دارم اسم ستون هام کد فرد که یونیک هست جنسیت و سال هست میخام نسبت اقا به کل در هر سال و نسبت خانم به کل در سال رو حساب کنم مژر میتونم بنویسم ؟میشه بگین چجوری؟
سلام
CALCULATE(COUNT(ID) , GENDER = “MARD)/CALCULATE(COUNT(ID) , ALL(TABLE))”
مطالبتون فوق العاده و آموزنده است خواهش میکنم ادامه ش بدید.