آموزش تابع CALCULATE در Power BI؛ از یک فیلتر ساده تا Measureهای حرفهای DAX
اگر مدت زیادی با Power BI کار نکرده باشید، ممکن است CALCULATE در نگاه اول فقط یک تابع دیگر در میان صدها تابع DAX به نظر برسد.
اما وقتی وارد ساخت Measureهای واقعی میشوید، داستان کاملاً متفاوت است.
فرض کنید مدیر یک فروشگاه زنجیرهای از شما میپرسد:
«فروش کل را دارم؛ حالا فروش شعبههای تهران را چطور جدا کنم؟»
بعد سؤال بعدی میآید:
«فروش تهران در مقایسه با کل کشور چند درصد بوده؟»
و بعد:
«فروش تهران در همین ماه سال قبل چقدر بوده؟»
و نهایتاً:
«اگر کاربر در گزارش یک شعبه را انتخاب کرد، بتوانم فروش آن را با کل فروش همه شعب مقایسه کنم.»
اینجاست که DAX از چند تابع ساده برای جمع و شمارش فاصله میگیرد و Context اهمیت پیدا میکند.
در مرکز بسیاری از این محاسبات، تابع CALCULATE قرار دارد.
Microsoft، CALCULATE را تابعی میداند که یک Expression را در یک Filter Context تغییریافته ارزیابی میکند.
اگر قصد دارید ساخت داشبورد رو حرفه ای یاد بگیرید کتاب آموزش نرم افزار هوش تجاری Power Bi به شما کمک می کنه میتونیدبا کلیک یا ضربه روی تصویر کتاب اون رو سفارش بدید
Contents
- 1. CALCULATE در Power BI چیست؟
- 2. CALCULATE را اینطور تصور کنید
- 3. اولین مثال؛ فروش یک شعبه خاص
- 4. چرا CALCULATE با SUM فرق دارد؟
- 5. CALCULATE و Filter Context
- 6. یک مثال کاربردی؛ فروش آنلاین در یک کانال خاص
- 7. CALCULATE با چند شرط
- 8. یک نکته مهم درباره فیلترهای CALCULATE
- 9. KEEPFILTERS چه زمانی به درد میخورد؟
- 10. CALCULATE و REMOVEFILTERS
- 11. CALCULATE و ALL چه ارتباطی دارند؟
- 12. CALCULATE و FILTER؛ این دو را اشتباه نگیرید
- 13. آیا همیشه باید از FILTER داخل CALCULATE استفاده کنیم؟
- 14. یکی از کاربردهای مهم CALCULATE؛ فعال کردن رابطه متفاوت
- 15. Context Transition چیست؟
- 16. یک سناریوی واقعی برای داشبورد فروش
- 17. اشتباه رایج شماره ۱؛ استفاده از CALCULATE برای همه چیز
- 18. اشتباه رایج شماره ۲؛ حفظ کردن CALCULATE بدون فهم Context
- 19. یک الگوی ذهنی ساده برای یادگیری CALCULATE
- 20. خلاصه مهمترین کاربردهای CALCULATE
- 21. تمرین عملی برای یادگیری CALCULATE
- 22. سؤالات متداول CALCULATE در Power BI
- 23. جمعبندی
- 24. مقالات مرتبط آموزش Power BI و DAX
CALCULATE در Power BI چیست؟
Syntax کلی CALCULATE به شکل زیر است:
CALCULATE(
<Expression>,
<Filter1>,
<Filter2>,
...
)
آرگومان اول محاسبهای است که میخواهیم انجام شود و آرگومانهای بعدی مشخص میکنند محاسبه با چه شرایط فیلتر جدیدی انجام شود.
برای مثال، ابتدا فروش کل را میسازیم:
Total Sales =
SUM(StoreSales[Amount])
حالا میخواهیم فروش شعبههای منطقه شمال را محاسبه کنیم:
North Sales =
CALCULATE(
[Total Sales],
Stores[Region] = "شمال"
)
در اینجا [Total Sales] همان محاسبه اصلی است، اما CALCULATE شرایطی را به آن اضافه کرده است تا محاسبه در Context مربوط به منطقه شمال انجام شود.
CALCULATE را اینطور تصور کنید
برای فهم CALCULATE لازم نیست از همان ابتدا وارد تعریفهای پیچیده شوید.
فعلاً آن را اینطور در ذهن داشته باشید:
یک محاسبه دارم
+
میخواهم شرایط اجرای آن را تغییر بدهم
=
CALCULATE
مثلاً:
[Total Sales]
یعنی فروش را حساب کن.
اما:
CALCULATE(
[Total Sales],
Stores[Region] = "شمال"
)
یعنی:
«فروش را حساب کن، اما در شرایطی که منطقه شمال باشد.»
همین ایده ساده، پایه تعداد زیادی از Measureهای حرفهای DAX است.
اولین مثال؛ فروش یک شعبه خاص
فرض کنید جدول StoreSales اطلاعات تراکنشهای فروش را نگهداری میکند و جدول Stores مشخصات شعب را دارد.
میخواهیم فروش شعبه «شریعتی» را محاسبه کنیم.
Shariati Sales =
CALCULATE(
[Total Sales],
Stores[StoreName] = "شریعتی"
)
نکته مهم این است که ما یک Measure جدید برای جمع کردن فروش ننوشتهایم.
از Measure موجود استفاده کردهایم:
[Total Sales]
و فقط Context آن را تغییر دادهایم.
این روش باعث میشود Measureهای پروژه ساختار منظمتری داشته باشند.
چرا CALCULATE با SUM فرق دارد؟
این دو تابع وظیفه یکسانی ندارند.
مثلاً:
Total Sales =
SUM(StoreSales[Amount])
میگوید:
«مقادیر ستون Amount را جمع کن.»
اما:
Tehran Sales =
CALCULATE(
[Total Sales],
Stores[City] = "تهران"
)
میگوید:
«همان محاسبه فروش را انجام بده، اما با شرط تهران.»
پس:
SUM بیشتر روی خود عملیات جمع تمرکز دارد.
CALCULATE روی Contextی تمرکز دارد که محاسبه در آن انجام میشود.
این تفاوت در پروژههای واقعی بسیار مهم است.
CALCULATE و Filter Context
یکی از مفاهیم اساسی Power BI، Filter Context است.
برای مثال فرض کنید در گزارش فروش، یک Slicer برای سال قرار دادهایم.
کاربر سال 1405 را انتخاب میکند.
حالا Measure:
Total Sales =
SUM(StoreSales[Amount])
در Context فعلی گزارش محاسبه میشود.
اگر کاربر یک شهر را هم انتخاب کند، Context باز هم تغییر میکند.
CALCULATE میتواند این Context را دستکاری کند؛ یعنی فیلترهای جدیدی به آن اضافه کند یا در بعضی سناریوها فیلترهای موجود را تغییر دهد.
به همین دلیل Microsoft، CALCULATE را یکی از ابزارهای اصلی برای تغییر Filter Context معرفی میکند.
یک مثال کاربردی؛ فروش آنلاین در یک کانال خاص
فرض کنید یک شرکت هم فروش حضوری دارد و هم فروش اینترنتی.
ستون Channel مشخص میکند هر سفارش از کجا آمده است.
فروش کل:
Total Sales =
SUM(Sales[Amount])
فروش اینترنتی:
Online Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Online"
)
فروش حضوری:
Store Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Store"
)
حالا میتوانیم این سه Measure را کنار هم در یک داشبورد قرار دهیم.
مثلاً:
| شاخص | مقدار |
|---|---|
| کل فروش | 18.4 میلیارد |
| فروش آنلاین | 7.2 میلیارد |
| فروش حضوری | 11.2 میلیارد |
نکته جالب اینجاست که اگر گزارش را برای یک ماه یا محصول خاص فیلتر کنید، این Measureها نیز متناسب با Context گزارش تغییر میکنند.
CALCULATE با چند شرط
CALCULATE میتواند بیش از یک فیلتر داشته باشد.
مثلاً مدیر شرکت میخواهد فروش آنلاین محصولات دیجیتال در شهر تهران را ببیند:
Tehran Digital Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Online",
Products[Category] = "Digital",
Stores[City] = "تهران"
)
حالا محاسبه فقط در شرایط تعیینشده انجام میشود.
این روش در ساخت KPIهای مدیریتی بسیار کاربردی است.
یک نکته مهم درباره فیلترهای CALCULATE
اگر ستونی که در Filter Argument استفاده کردهاید از قبل در Context فیلتر داشته باشد، رفتار پیشفرض CALCULATE میتواند فیلتر موجود روی همان ستون را با فیلتر جدید جایگزین کند.
مثلاً اگر Context فعلی شامل چند شهر باشد و CALCULATE شرطی برای تهران اعمال کند، نتیجه مربوط به Context جدید خواهد بود.
این رفتار یکی از نقاطی است که کاربران تازهکار معمولاً در آن با CALCULATE دچار ابهام میشوند. Microsoft نیز توضیح میدهد که در حالت استاندارد، فیلترهای جدید روی همان ستونها میتوانند فیلترهای قبلی را بازنویسی کنند؛ برای حفظ فیلتر موجود در کنار فیلتر جدید میتوان از KEEPFILTERS استفاده کرد.
KEEPFILTERS چه زمانی به درد میخورد؟
فرض کنید کاربر در گزارش چند استان را انتخاب کرده و Measure شما میخواهد فیلتر دیگری روی همان ستون اعمال کند.
در بعضی سناریوها نمیخواهیم انتخاب کاربر کنار گذاشته شود؛ بلکه میخواهیم فیلتر جدید با انتخاب موجود ترکیب شود.
اینجاست که KEEPFILTERS میتواند مفید باشد:
Selected North Sales =
CALCULATE(
[Total Sales],
KEEPFILTERS(
Stores[Region] = "شمال"
)
)
KEEPFILTERS نحوه اعمال فیلتر در CALCULATE یا CALCULATETABLE را تغییر میدهد و باعث میشود فیلتر جدید با فیلتر موجود بهصورت Intersection در نظر گرفته شود.
البته لازم نیست در Measureهای ساده همیشه از KEEPFILTERS استفاده کنید. بهتر است ابتدا رفتار معمول CALCULATE را یاد بگیرید و بعد سراغ این قابلیت بروید.
CALCULATE و REMOVEFILTERS
یکی از کاربردهای جذاب CALCULATE زمانی است که بخواهیم یک فیلتر را از محاسبه حذف کنیم.
فرض کنید در یک Matrix، فروش محصولات را نمایش دادهایم و میخواهیم بدانیم هر محصول چه سهمی از کل فروش دارد.
فروش کل:
Total Sales =
SUM(Sales[Amount])
حالا:
All Products Sales =
CALCULATE(
[Total Sales],
REMOVEFILTERS(Products[ProductName])
)
REMOVEFILTERS برای پاک کردن فیلتر از جدول یا ستون مشخصشده استفاده میشود.
حالا میتوانیم درصد سهم محصول را بسازیم:
Product Share =
DIVIDE(
[Total Sales],
[All Products Sales]
)
فرض کنید خروجی Matrix این باشد:
| محصول | فروش | سهم از کل |
|---|---|---|
| لپتاپ | 4.8 میلیارد | 38% |
| مانیتور | 2.9 میلیارد | 23% |
| پرینتر | 2.1 میلیارد | 17% |
| سایر محصولات | 2.8 میلیارد | 22% |
اینجا دیگر CALCULATE فقط یک «فیلتر ساده» نیست؛ بلکه به ما کمک کرده است نسبت هر محصول را با یک مقدار مرجع بسنجیم.
CALCULATE و ALL چه ارتباطی دارند؟
احتمالاً در مثالهای DAX با ALL هم مواجه شدهاید.
مثلاً:
All Product Sales =
CALCULATE(
[Total Sales],
ALL(Products[ProductName])
)
ALL میتواند فیلترهای اعمالشده روی جدول یا ستون را نادیده بگیرد. Microsoft در مستندات توابع Filter نیز ALL و REMOVEFILTERS را در گروه توابعی قرار میدهد که برای کنترل فیلترها استفاده میشوند.
با این حال، اگر هدف شما مشخصاً حذف فیلتر باشد، REMOVEFILTERS معمولاً بیان واضحتری از قصد Measure ارائه میکند.
CALCULATE و FILTER؛ این دو را اشتباه نگیرید
CALCULATE و FILTER هر دو با فیلتر سروکار دارند، اما یک کار انجام نمیدهند.
FILTER یک جدول یا Expression جدولی را دریافت میکند و فقط ردیفهایی را برمیگرداند که شرط را برقرار میکنند:
FILTER(
Sales,
Sales[Amount] > 50000000
)
اما CALCULATE یک Expression را در Context فیلتر جدید ارزیابی میکند.
به همین دلیل ممکن است این دو را کنار هم ببینیم:
High Value Sales =
CALCULATE(
[Total Sales],
FILTER(
Sales,
Sales[Amount] > 50000000
)
)
FILTER در اینجا جدول موردنظر را مشخص میکند و CALCULATE محاسبه را با آن فیلتر انجام میدهد. مستندات Microsoft نیز FILTER را تابعی معرفی میکند که یک زیرمجموعه از جدول یا Expression را برمیگرداند و اشاره میکند که میتواند در سایر توابعی که به جدول نیاز دارند استفاده شود.
آیا همیشه باید از FILTER داخل CALCULATE استفاده کنیم؟
خیر.
برای شرطهای ساده، معمولاً نوشتن مستقیم شرط خواناتر است.
مثلاً:
Tehran Sales =
CALCULATE(
[Total Sales],
Stores[City] = "تهران"
)
نیازی ندارد که آن را بیدلیل به این شکل بنویسیم:
Tehran Sales =
CALCULATE(
[Total Sales],
FILTER(
Stores,
Stores[City] = "تهران"
)
)
FILTER زمانی ارزش بیشتری پیدا میکند که منطق فیلتر پیچیدهتر باشد یا واقعاً به یک Table Expression نیاز داشته باشیم.
یکی از کاربردهای مهم CALCULATE؛ فعال کردن رابطه متفاوت
در مدلهای حرفهای Power BI ممکن است بین دو جدول چند نوع رابطه منطقی داشته باشیم؛ مثلاً یک جدول فروش هم Order Date داشته باشد و هم Ship Date.
ممکن است یکی از روابط Active و دیگری Inactive باشد.
در چنین سناریوهایی میتوان از USERELATIONSHIP در CALCULATE استفاده کرد تا رابطه موردنظر برای محاسبه فعال شود.
مثلاً:
Sales By Ship Date =
CALCULATE(
[Total Sales],
USERELATIONSHIP(
Sales[ShipDate],
'Date'[Date]
)
)
این یکی از نمونههایی است که نشان میدهد CALCULATE فقط برای «فیلتر شهر = تهران» ساخته نشده است؛ بلکه در مدلسازی و تحلیل حرفهای DAX نقش بسیار گستردهتری دارد. Microsoft، USERELATIONSHIP و CROSSFILTER را نیز در گروه Filter Modifierهایی معرفی میکند که در CALCULATE برای کنترل روابط و Filter Context کاربرد دارند.
Context Transition چیست؟
این بخش کمی پیشرفتهتر است، اما اگر میخواهید DAX را جدی یاد بگیرید، بهتر است با مفهوم آن آشنا باشید.
CALCULATE حتی در صورت نداشتن Filter Argument نیز کاربرد خاصی دارد: میتواند Row Context را به Filter Context تبدیل کند.
این رفتار را Context Transition مینامند.
برای کاربر تازهکار، شاید این تعریف کمی انتزاعی باشد.
فعلاً این تصویر ذهنی را داشته باشید:
Row Context
↓
CALCULATE
↓
Filter Context
این موضوع زمانی اهمیت بیشتری پیدا میکند که با Calculated Columnها، Iteratorها و Measureهای پیچیدهتر کار کنید.
برای همین توصیه میکنم در شروع کار، قبل از اینکه وارد مثالهای خیلی پیچیده Context Transition شوید، ابتدا رفتار CALCULATE در Filter Context را بهخوبی یاد بگیرید.
یک سناریوی واقعی برای داشبورد فروش
فرض کنید مدیر یک شرکت پخش میخواهد چهار شاخص را در داشبورد مشاهده کند:
- فروش کل
- فروش آنلاین
- فروش شعب
- سهم فروش آنلاین
Measureهای اصلی:
Total Sales =
SUM(Sales[Amount])
Online Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Online"
)
Store Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Store"
)
و:
Online Share =
DIVIDE(
[Online Sales],
[Total Sales]
)
حالا اگر مدیر سال، استان یا گروه محصول را در Slicer تغییر دهد، Measureها نیز با Context جدید گزارش دوباره محاسبه میشوند.
این همان چیزی است که Power BI را از گزارشهای ثابت Excel متمایز میکند: Measureها به Context گزارش واکنش نشان میدهند.
اشتباه رایج شماره ۱؛ استفاده از CALCULATE برای همه چیز
اینکه CALCULATE تابع بسیار قدرتمندی است به این معنی نیست که باید همه Measureها را با CALCULATE بنویسیم.
اگر فقط میخواهید یک ستون را جمع کنید:
Total Sales =
SUM(Sales[Amount])
کاملاً کافی است.
نوشتن:
Total Sales =
CALCULATE(
SUM(Sales[Amount])
)
در اینجا ارزش خاصی به محاسبه ساده شما اضافه نمیکند.
اشتباه رایج شماره ۲؛ حفظ کردن CALCULATE بدون فهم Context
اگر فقط Syntax زیر را حفظ کنید:
CALCULATE(Expression, Filter)
احتمالاً خیلی زود در Measureهای واقعی به مشکل میخورید.
بخش مهم ماجرا این است که بدانید قبل از CALCULATE چه Contextی وجود دارد و بعد از آن چه تغییری میکند.
این موضوع یکی از دلایل اصلی است که یادگیری Filter Context و Row Context در DAX اهمیت زیادی دارد.
یک الگوی ذهنی ساده برای یادگیری CALCULATE
هر زمان Measure پیچیدهای میبینید، این چهار سؤال را از خودتان بپرسید:
۱. محاسبه اصلی چیست؟
مثلاً:
[Total Sales]
۲. Context فعلی گزارش چیست؟
مثلاً:
سال = 1405
استان = خراسان رضوی
۳. CALCULATE چه تغییری ایجاد میکند؟
مثلاً:
Channel = Online
۴. نتیجه جدید چیست؟
یعنی:
فروش آنلاین
در سال 1405
در خراسان رضوی
اگر با این نگاه به Measureها نگاه کنید، خواندن کدهای DAX بسیار سادهتر میشود.
خلاصه مهمترین کاربردهای CALCULATE
CALCULATE را میتوان برای کارهایی مانند این استفاده کرد:
- اعمال فیلتر جدید روی یک Measure
- تغییر Filter Context
- حذف فیلترها
- حفظ فیلترهای موجود با KEEPFILTERS
- استفاده از FILTER برای شرایط پیچیدهتر
- استفاده از ALL و REMOVEFILTERS برای مقایسه با کل
- استفاده از USERELATIONSHIP برای محاسبات مبتنی بر رابطه دیگر
- ایجاد بسیاری از محاسبات زمانی و تحلیلی
توابع فیلتر DAX دقیقاً برای همین نوع دستکاری Context و ایجاد محاسبات پویا طراحی شدهاند.
تمرین عملی برای یادگیری CALCULATE
برای اینکه مطالب این مقاله فقط در حد تئوری باقی نماند، یک جدول فروش با ستونهای زیر بسازید:
Date
Product
Category
City
Channel
Quantity
Amount
سپس این Measureها را خودتان ایجاد کنید:
تمرین اول
فروش کل را محاسبه کنید.
تمرین دوم
فقط فروش آنلاین را محاسبه کنید.
تمرین سوم
فروش شهر تهران را محاسبه کنید.
تمرین چهارم
فروش آنلاین محصولات یک دسته مشخص را محاسبه کنید.
تمرین پنجم
فروش هر محصول را بهعنوان درصدی از فروش تمام محصولات محاسبه کنید.
تمرین ششم
یک Measure بسازید که فیلتر محصول را نادیده بگیرد اما فیلتر سال را حفظ کند.
اگر بتوانید این تمرینها را بدون کپی کردن فرمول از اینترنت انجام دهید، قدم بسیار خوبی برای ورود به DAX حرفهای برداشتهاید.
سؤالات متداول CALCULATE در Power BI
CALCULATE در DAX چه کاری انجام میدهد؟
CALCULATE یک Expression را در یک Filter Context تغییریافته ارزیابی میکند و به همین دلیل یکی از مهمترین ابزارهای DAX برای ساخت محاسبات شرطی و تحلیلی است.
آیا CALCULATE فقط برای فیلتر کردن استفاده میشود؟
خیر. علاوه بر اضافه کردن یا تغییر فیلترها، میتواند برای حذف فیلتر، کنترل نحوه اعمال فیلترها و استفاده از روابط متفاوت نیز به کار برود.
تفاوت CALCULATE و FILTER چیست؟
FILTER یک جدول فیلترشده برمیگرداند، اما CALCULATE یک Expression را در Context تغییریافته ارزیابی میکند. این دو تابع در بسیاری از Measureهای پیشرفته در کنار هم استفاده میشوند.
CALCULATE برای یادگیری Power BI ضروری است؟
اگر قصد دارید از Power BI فقط برای ساخت نمودارهای ساده استفاده نکنید و Measureهای تحلیلی و داشبوردهای حرفهای بسازید، یادگیری CALCULATE بسیار مهم است.
بعد از CALCULATE چه چیزی یاد بگیریم؟
پیشنهاد میکنم مسیر را اینگونه ادامه دهید:
CALCULATE → FILTER → DIVIDE → ALL و REMOVEFILTERS → RANKX → Row Context و Filter Context → Time Intelligence
این ترتیب باعث میشود مفاهیم بهصورت زنجیرهای روی یکدیگر ساخته شوند.
جمعبندی
CALCULATE را اگر فقط بهعنوان یک Syntax حفظ کنید، بخش کوچکی از قدرت آن را یاد گرفتهاید.
اصل ماجرا Context است.
وقتی مینویسیم:
Tehran Sales =
CALCULATE(
[Total Sales],
Stores[City] = "تهران"
)
در واقع نگفتهایم فقط «فروش تهران را جمع کن».
گفتهایم:
همان محاسبه فروش را بردار و آن را در یک Context متفاوت اجرا کن.
از همین ایده ساده میتوان به محاسباتی مانند سهم از کل، مقایسه دورهها، فروش یک کانال خاص، حذف فیلتر، استفاده از رابطه متفاوت و بسیاری از Measureهای حرفهای رسید.
اگر میخواهید DAX را اصولی یاد بگیرید، CALCULATE یکی از آن توابعی است که ارزش دارد برایش وقت بگذارید؛ چون بعد از یادگیری آن، بسیاری از فرمولهایی که قبلاً پیچیده به نظر میرسیدند، منطق قابل فهمتری پیدا میکنند.
مقالات مرتبط آموزش Power BI و DAX
برای ادامه مسیر یادگیری پیشنهاد میکنیم این مقالات را نیز مطالعه کنید:
تفاوت Measure و Calculated Column در Power BI
برای آشنایی با تفاوت دو روش مهم محاسبه در Power BI.
تفاوت SUM و SUMX در Power BI
برای درک بهتر Iteratorها و محاسبات ردیفبهردیف.
تفاوت Row Context و Filter Context در DAX چیست؟ آموزش ساده با مثالهای عملی
آموزش تابع FILTER در Power BI (به زودی)
برای آشنایی با فیلتر کردن جدولها و استفاده از FILTER در DAX.
Context Transition در DAX چیست؟ (به زودی)
موضوع بعدی این مجموعه برای درک ارتباط Row Context و Filter Context.
درباره ایمان اشکاوند راد
مدیر فناوری و طراح و مشاور سیستم های نرم افزاری، مدرس دانشگاه با بیش از ۱۸ سال سابقه تدریس مهارت ها و دروس کامپیوتری در دانشگاه ها و شرکتهای مختلف، مولف مجموعه کتابهای بیت، تولید بسته های آموزشی کامپیوتر، علاقه مند به حوزه های پایگاه داده، BI، برنامه نویسی، اکسل و آفیس، مدیر انتشارات و آکادمی آموزشی اشکاوند
نوشتههای بیشتر از ایمان اشکاوند راد

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