آموزش DAX در Power Bi قسمت اول
در این مطلب قصد داریم به آموزش DAX در Power BI بپردازیم. در اولین گام قصد داریم به مرور مفاهیم پایه ای در زبان DAX بپردازیم. مفاهیم بسیار مهمی مثل Row Context و Filter Context.
قبل از مطالعه حتما به این مطلب سری بزنید تا مطمئن شوید می دانید DAX چیست؟
DAX مخفف عبارت Data Analysis Expression زبان مشترک بین نرم افزار های Power BI، همچنین Excel Power Pivot و SSAS Tabular است. زبان DAX مجموعه ای از توابع، اپراتور ها و محدودیت ها است که می تواند یک یا چند مقدار را به عنوان خروجی تولید کند و به شما کمک کند تا اطلاعات جدیدی از دل داده های خود استخراج کنید.
Context
در اکوسیستم زبان DAX دو نوع Context وجود دارد. این دو مفهوم بسیار مهم عبارتند از Row Context و Filter Context.
Row Context
این مفهوم بسیار مهم به ردیف جاری اشاره دارد. هنگامی که یک ستون محاسباتی ایجاد می کنید در واقع این مفهوم به میان می آید، چرا که ستون محاسباتی ردیف به ردیف محاسبه می شود.
فرض کنید می خواهیم در جدول فروش تعداد فروش را در قیمت ضرب کنیم. تصویر این عملیات را مشاهده می کنید.
در واقع محاسبات ردیف به ردیف صورت می گیرد. پس در هر لحظه یک ردیف جاری وجود دارد که محاسبه برای آن ردیف صورت می گیرد. ستون محاسباتی تنها جایی نیست که Row Context ایجاد می شود، اما یکی از مهم ترین موارد آن است.
حال فرض کنید همین فرمول را به عنوان یک مژر ایجاد کنیم. هر چه سعی می کنم UnitPrice را تایپ کنم، موفق به انجام آن نمی شوم. مگر این که یک Row Context ایجاد کنم. در واقع بدون ایجاد آن موتور نرم افزار نمی تواند تشخیص دهد این محاسبه برای کدام ردیف صورت پذیرد.
با استفاده از تابع SUMX این Row Context را ایجاد می کنیم. به SUMX می گویم برو در جدول Sales (آرگومان اول)، ردیف به ردیف تعداد را در قیمت ضرب کن (آرگومان دوم). پس ردیف به ردیف تعداد را در قیمت ضرب کرده و در نهایت آن را با هم جمع می کند.
Filter Context
محاسبات شما اصولا با توجه به Filter Context صورت می پذیرد. شما یک مژر را در یک Matrix استفاده می کنید و در سلول های مختلف آن با اعداد متفاوتی روبرو می شوید. به مثال زیر توجه کنید.
در Card هیچ اثری از Filter Context نیست. پس جمع کل محاسبه شده است (1). در شماره 2 در واقع Filter Context، سال 2011 و کانال Catalog است، پس محاسبه برای این دو مقدار صورت می پذیرد.
در شماره 3 Filter Context تنها Reseller است، پس میزان فروش برای کانال Reseller محاسبه می شود. در شماره 4 در واقع Filter Context سال 2012 است. در شماره 5 هیچ گونه Filter Context اعمال نشده پس معادل جمع کل است.
پس وقتی گفته می شود خروجی مژر یک عدد است، منظور ما یک عدد به ازای هر Filter Context است. در واقع با ساخت مژر محاسبات در Filter Context مورد نظر شما انجام می شود. به همین دلیل است که با تغییر سر ستون ها به طور مثال از ChannelName به نام کالا باز هم محاسبات به درستی انجام می شوند.
دو مفهوم Row Context و Filter Context قدرت بی نظیری به شما اعطا می کند. شاید تا به حال اسمی از این مفاهیم به گوش شما نخورده باشد، اما هر لحظه در حال استفاده از آن ها هستید.
با سری مطالب آموزش زبان DAX در Power BI همراه باشید تا با هم سیری در دنیای زیبای زبان DAX داشته باشیم.
درباره حسین وثوقی
دانش آموخته مهندسی صنایع و مدیریت فناوری اطلاعات دانشگاه تهران، علاقه مند به تحلیل و ارائه راه حل برای مسائل و بهینه سازی راه حل ها هستم ...
نوشته های بیشتر از حسین وثوقی
با سلام
مثل همیشه مطلب آموزشی مفید و مفهومی و کاربردی بود. بسیار ممنون از مطالب آموزشی که در این سایت قرار می دهید.
سلام … ممنون از همراهی شما
ایتاد واقعا ممنون که از پایه همه رو توضیح میدن ،چقدر درک کردنش راحت میشه،ممنون
یه سوال اینکه فرض کنید ما دو ستون تعداد و قیمت داریم و میخواهیم در زبان دکس از ضرب اینها یک ستون جدید ایجاد کنیم.خب راه ساده اینه که مثل اکسل در هم ضرب کنیم و تمام. اما راه پیچیده اینه که تابع sumx بزنیم و اون رو داخل تابع calculate قرار بدیم.که دقیقا نتایج همونه.اما اگه تابع sumxرو در تابع calculate قرار ندیم نتیجه همه سلول ها یکی ست. همه اینها رو گفتم که بپرسم که آنچه باعث میشه که تابع calculate درست عمل کنه قابلیت filter context هست یا row context?? اصلا کدوم توابع دکس این قابلیت رو… ادامه...
سلام مثال رو بهترش کنیم. فرض کنید دو جدول دارید مشتری و فروش که رابطه یک به چند دارند شما در جدول مشتری یک ستون جدید ایجاد می کنید و تعداد رو در قیمت ضرب می کنید و با تابع SUM جمع می کنید همان طور که گفتید نتیجه برای تمامی مشتریان مساوی و برابر با جمع کل فروش است دلیل چیست؟ چون هنگام ایجاد ستون جدید Row Context وجود دارد اما Filter Context وجود ندارد(فیلتری صورت نمی گیرد) اما وقتی درون یک Row Context (ایجاد ستون جدید) تابع CALCULATE رو بنویسیم در واقع Row Context به Filter Context تبدیل… ادامه...
آیا calculate تنها تابع با این قابلیت هست؟
این قابلیت در CALCULATE وجود داره
ولی با RELATEDTABLE هم میشه مشابهش رو انجام داد