SUM به همراه CALCULATE یا بدون CALCULATE، مساله این است!
حتما پیش اومده که با نوشتن برخی فرمول های DAX، هر چند به ظاهر یکسان نتایج متفاوتی رو دریافت کرده باشید. برای این که درک بهتری از نوع عملکرد محاسبات در DAX داشته باشیم لازمه برخی از مفاهیم محاسباتی رو دقیق تر متوجه بشیم. از جمله این مفاهیم که در این مقاله به بررسی اون می پردازیم تفاوت انواع فیلتر و زمینه محاسباتی در DAX می باشد.
پیش نیاز : اطلاع از اصطلاحات اولیه و پایه ای DAX و Power BI برای درک بهتر مطالب این مقاله پیشنهاد میشه.
CONTEXT
CONTEXT به مجموعه اطلاعات و شرایطی گفته میشه که نوع و ساختار عملیات و پردازشی رو تعیین میکنه. در حقیقت محاسباتی که در DAX انجام میشه تحت تاثیر فیلترهای visual ها، روابط بین جداول، فیلتر های توابع و … هستن. این تعامل و عکس العمل ها باعث میشه بتونیم آنالیزهای پویا (DYNAMIC) ایجاد و استفاده کنیم. سه نوع CONTEXT در DAX وجود داره که عبارتند از :
- ROW CONTEXT
- FILTER CONTEXT
- QUERY CONTEXT
ROW CONTEXT
اگر فرمولی به صورت CALCULATED COLUMN نوشته باشید؛ به تمامی مقادیر در همه ستون ها برای سطر جاری ROW CONTEXT گفته میشه. در صورتی که جدول با جدول دیگه ای هم در ارتباط باشه ROW CONTEXT شامل تمامی مقادیر جدول دیگه که در ارتباط با سطر جاری باشند هم می شود. پس همه چیز بر میگرده به سطر. فرض کنید جداولی دارید شامل اطلاعات زیر :
جدول Sales :
Product | Qty |
A | ۱۰۰ |
B | ۲۰۰ |
C | ۳۰۰ |
A | ۴۰۰ |
B | ۵۰۰ |
جدول Product :
Product | Price |
A | ۱۰ |
B | ۲۰ |
C | ۳۰ |
ضرب مقدار کالا در قیمت کالا در مثال بالا در صورتی که به ازای سطر جاری از جدول Sales مقدار قیمت رو از جدول Product بیاوریم یک مثال ساده از ROW CONTEXT خواهد بود.
به طور کلی میشه ویژگی ها و موارد زیر رو شامل ROW CONTEXT دونست :
- فرمول های Calculated Column
- سطرهای جاری
- توابع X-ENDING مثل SUMX یا RANKX
FILTER CONTEXT و QUERY CONTEXT
هر چند در طبقه بندی صورت گرفته توسط مایکروسافت QUERY CONTEXT مجزا بررسی شده ولی در محاسبات DAX می توان گفت این دو از نظر عملکردی کاملا مشابه یکدیگر عمل می کنند و تفاوت چندانی میان آن ها وجود نداره. زمانی که فیلتری رو از طریق آرگومان های تابع در فرمول اعمال می کنیم به این نوع فیلتر، FILTER CONTEXT گفته میشه. در محاسبات اولویت از بین سه نوع CONTEXT مورد بحث همیشه با FILTER CONTEXT خواهد بود. یعنی اگر در فرمولی به طور مثال از تابع FILTER استفاده کنید اولویت محاسباتی با این تابع خواهد بود. و اما اگر از روش های دیگری به غیر از نوشتن مستقیم شرط مورد نظرتون که باعث ایجاد یک زیر مجموعه از داده های اصلی میشه فیلتر و مجموعه داده شکل بگیره به اون QUERY CONTEXT گفته میشه.
یعنی FILTER CONTEXT تنها شامل هر گونه فیلتر که از طریق آرگومان های توابع اعمال میشه خواهد بود و QUERY CONTEXT شامل مواردی چون :
- فیلترهای نمودارها و visual ها
- slicer ها
- تاثیر سطر و ستون Pivot Table و Table
- فیلترهای متقاطع
در نتیجه اگر ستونی رو در Visual قرار میدید یا به طور مثال مجموع فروش بیشتر از ۲۰ عدد در هر سفارش رو محاسبه کنید با یک FILTER CONTEXT رو به رو خواهید بود. با این کار مجموعه ای جدید از داده ها رو شکل میدید که محاسبات بر روی اون انجام میشه.
SUM به همراه CALCULATE یا بدون CALCULATE، مساله این است!
قبل از این که این موضوع رو پیش ببریم با اصطلاحی آشنا میشیم به نام CONTEX TRANSITION. زمانی که از توابع CALCULATE یا CALCULATETABLE استفاده می کنیم اتفاقی که میفته اینه که ROW CONTEXT ها به FILTER CONTEXT تبدیل میشوند. این تبدیل تاثیر قابل توجهی بر روی محاسبات DAX خواهد داشت. اما به چه صورت؟
مثال بخش قبل رو در نظر بگیرید اگر تابع SUM رو بر روی ستون Qty اعمال کنیم خواهیم داشت :
در این مثال نتیجه جمع ستون Qty یعنی ۱۵۰۰ برای همه سطرها تکرار شده. در حقیقت SUM جمع همه سطرها رو در FILTER CONTEXT و مجموعه داده موجود یعنی همین داده هایی که بدون هیچ فیلتری داریم مشاهده میکنیم حساب میکنه و به صورت سطر به سطر این مقدار برگردونده میشه. به عبارت دیگه جمعی که برای هر سطر محاسبه میشه جمع کل داده های ستونه.
اما درصورت استفاده از CALCULATE نتیجه متفاوت خواهد شد :
در این حالت تفاوتی که بوجود میاد تبدیل ROW CONTEXT به FILTER CONTEXT به ازای هر سطر به خاطر استفاده از CALCULATE هستش. یعنی با وجود این که هیچ گونه پارامتری در CALCULATE وجود نداره هر سطر به یک زیر مجموعه از داده ها تبدیل میشه و محاسبات بر روی اون سطر انجام میشه. به عبارت دیگه به ازای سطر جاری مثلا سطر اول، ROW CONTEXT که شامل همه مقادیر ستون های اون سطره به FILTER CONTEXT تبدیل میشه و اینجاست که سطر اول شما یک زیر مجموعه (SUBSET) داده یک سطری خواهد شد که جمع بر روی اون صورت میگیره. مثه این که به صورت دستی جدول رو فیلتر میکنید سطر به سطر اینکار رو انجام میدید و جمع رو در هر بار در ستون CALCULATE می نویسید.
برای حذف این فیلتر ها و تحت تاثیر قرار دادن این فیلترها، استفاده از توابع گروه FILTER مثل ALL توصیه میشه!
عالی و بسیار مفید
سپاس از نظر شما 👍