Row Context و Filter Context در DAX چیست؟ آموزش ساده با مثالهای عملی
اگر مدتی با Power BI کار کرده باشید، احتمالاً با دو اصطلاح مهم در DAX روبهرو شدهاید:
Row Context و Filter Context
این دو مفهوم در نگاه اول کمی پیچیده به نظر میرسند، اما واقعیت این است که بخش زیادی از رفتار Measureها، Calculated Columnها و توابع DAX بدون درک این دو مفهوم قابل فهم نیست.
برای مثال شاید برایتان سؤال شده باشد که چرا یک Measure ساده مثل:
Total Sales =
SUM(Sales[Sales Amount])
وقتی در جدول شهرها قرار میگیرد، برای هر شهر عدد متفاوتی نشان میدهد؟
یا چرا یک فرمول DAX در Calculated Column با همان فرمول در یک Measure رفتار یکسانی ندارد؟
پاسخ بسیاری از این سؤالها به Context در DAX برمیگردد.
در این مقاله از مجموعه آموزش Power BI سایت اشکاوند، میخواهیم بدون ورود به توضیحات بیش از حد تئوریک، با مثالهای واقعی ببینیم Row Context چیست، Filter Context چیست و تفاوت Row Context و Filter Context در Power BI دقیقاً کجاست.
Contents
- 1. Row Context چیست؟
- 2. Filter Context چیست؟
- 3. یک مثال ساده برای فهم Filter Context
- 4. تفاوت Row Context و Filter Context در یک مثال
- 5. آیا Measure دارای Row Context است؟
- 6. Iterator چیست و چه ارتباطی با Row Context دارد؟
- 7. تفاوت SUM و SUMX از دید Context
- 8. یک مثال واقعیتر؛ محاسبه سود هر سفارش
- 9. Filter Context از کجا وارد میشود؟
- 10. CALCULATE چه نقشی در Filter Context دارد؟
- 11. Filter Context و Slicer
- 12. Filter Context و روابط بین جداول
- 13. آیا Row Context همان Filter Context است؟
- 14. اشتباه رایج؛ فکر کردن به هر ردیف Visual بهعنوان Row Context
- 15. یک تمرین برای درک Context
- 16. چرا یادگیری Context برای DAX ضروری است؟
- 17. ارتباط Row Context و Filter Context با Context Transition
- 18. جمعبندی
Context در DAX چیست؟
کلمه Context در DAX را میتوان به زبان ساده به معنی شرایطی که محاسبه در آن انجام میشود در نظر گرفت.
وقتی Power BI یک فرمول DAX را محاسبه میکند، فقط خود فرمول اهمیت ندارد؛ بلکه باید بدانیم این فرمول:
- روی چه دادهای اجرا میشود؟
- چه فیلترهایی فعال هستند؟
- کاربر چه چیزی را در Slicer انتخاب کرده؟
- در کدام ردیف جدول قرار داریم؟
- چه فیلترهایی از Visual به Measure منتقل شدهاند؟
- ارتباط بین جداول چگونه است؟
به مجموعه این شرایط Context گفته میشود.
دو نوع Context که باید ابتدا یاد بگیرید عبارتاند از:
Row Context
و
Filter Context
البته در مباحث پیشرفتهتر DAX با مفاهیمی مانند Context Transition نیز روبهرو میشویم که در ادامه مسیر یادگیری به آن خواهیم رسید.
Row Context چیست؟
Row Context یعنی DAX در حال کار کردن با یک ردیف مشخص از دادههاست.
این مفهوم بیشتر هنگام کار با:
- Calculated Column
- Iteratorهایی مانند SUMX
- AVERAGEX
- FILTER
- برخی توابع دیگر
اهمیت پیدا میکند.
برای درک بهتر، یک جدول فروش فرضی داشته باشیم:
| محصول | تعداد | قیمت واحد |
|---|---|---|
| لپتاپ | 2 | 30,000,000 |
| مانیتور | 3 | 8,000,000 |
| کیبورد | 5 | 2,000,000 |
فرض کنید میخواهیم مبلغ هر ردیف را محاسبه کنیم.
فرمول میتواند این باشد:
Amount =
Sales[Quantity] * Sales[Unit Price]
اگر این فرمول را بهعنوان Calculated Column ایجاد کنیم، Power BI آن را برای هر ردیف محاسبه میکند.
برای ردیف اول:
2 × 30,000,000 = 60,000,000
برای ردیف دوم:
3 × 8,000,000 = 24,000,000
و برای ردیف سوم:
5 × 2,000,000 = 10,000,000
در اینجا هر بار یک ردیف مشخص در حال محاسبه است.
این همان چیزی است که برای درک اولیه Row Context در DAX نیاز داریم.
Row Context در Calculated Column
یکی از سادهترین جاهایی که Row Context را میتوان مشاهده کرد، Calculated Column است.
مثلاً:
Total Amount =
Sales[Quantity] * Sales[Unit Price]
Power BI این محاسبه را برای هر ردیف انجام میدهد.
میتوانیم نتیجه را به شکل زیر تصور کنیم:
| محصول | تعداد | قیمت | مبلغ |
|---|---|---|---|
| لپتاپ | 2 | 30M | 60M |
| مانیتور | 3 | 8M | 24M |
| کیبورد | 5 | 2M | 10M |
در ردیف لپتاپ، DAX مقدار Quantity و Unit Price همان ردیف را در اختیار دارد.
در ردیف مانیتور، مقادیر همان ردیف را میبیند.
و همین اتفاق برای تمام ردیفهای جدول تکرار میشود.
به همین دلیل میتوان گفت:
Row Context یعنی «من الان در کدام ردیف هستم؟»
این جمله تعریف رسمی و کامل DAX نیست، اما برای شروع یادگیری یک مدل ذهنی بسیار مناسب است.
Filter Context چیست؟
حالا به مفهوم مهمتر دیگری میرسیم:
Filter Context
Filter Context یعنی مجموعه فیلترهایی که مشخص میکنند کدام دادهها در یک محاسبه در نظر گرفته شوند.
این فیلترها میتوانند از قسمتهای مختلف گزارش ایجاد شوند.
مثلاً:
- Slicer
- Filter Pane
- فیلترهای Visual
- فیلترهای صفحه
- فیلترهای گزارش
- سطرها و ستونهای یک Matrix یا Table
- روابط بین جداول
- توابع DAX مانند CALCULATE
برای مثال فرض کنید یک Measure داریم:
Total Sales =
SUM(Sales[Sales Amount])
اگر هیچ فیلتری وجود نداشته باشد، فروش تمام دادهها محاسبه میشود.
اما اگر کاربر در Slicer سال 1404 را انتخاب کند، همین Measure فقط فروش مربوط به سال انتخابشده را محاسبه خواهد کرد.
اگر کاربر شهر تهران را نیز انتخاب کند، Context دوباره محدودتر میشود.
بنابراین میتوانیم به زبان ساده بگوییم:
Filter Context مشخص میکند «کدام دادهها باید در محاسبه حضور داشته باشند؟»
یک مثال ساده برای فهم Filter Context
فرض کنید اطلاعات فروش شرکت به این شکل است:
| شهر | محصول | فروش |
|---|---|---|
| تهران | لپتاپ | 100M |
| تهران | مانیتور | 50M |
| مشهد | لپتاپ | 80M |
| مشهد | مانیتور | 40M |
Measure زیر را ایجاد میکنیم:
Total Sales =
SUM(Sales[Sales Amount])
اگر این Measure را در یک Card قرار دهیم:
270M
نمایش داده میشود.
اما اگر یک Table بسازیم و City را داخل آن قرار دهیم:
| شهر | Total Sales |
|---|---|
| تهران | 150M |
| مشهد | 120M |
| مجموع | 270M |
یک Measure داریم، اما برای هر شهر نتیجه متفاوت شده است.
آیا Measure تغییر کرده؟
خیر.
فرمول همان است:
SUM(Sales[Sales Amount])
چیزی که تغییر کرده Filter Context است.
در ردیف تهران، Context مربوط به تهران است.
در ردیف مشهد، Context مربوط به مشهد است.
به همین دلیل نتیجه Measure تغییر میکند.
تفاوت Row Context و Filter Context در یک مثال
برای اینکه تفاوت این دو کاملاً مشخص شود، این مثال را در نظر بگیرید.
جدول فروش:
| محصول | تعداد | قیمت | مبلغ |
|---|---|---|---|
| لپتاپ | 2 | 30M | 60M |
| مانیتور | 3 | 8M | 24M |
| پرینتر | 2 | 5M | 10M |
اگر بخواهیم مبلغ هر ردیف را حساب کنیم:
Amount =
Sales[Quantity] * Sales[Unit Price]
اینجا با Row Context سروکار داریم.
اما اگر بخواهیم مجموع فروش را محاسبه کنیم:
Total Sales =
SUM(Sales[Amount])
و سپس فقط فروش لپتاپها را نمایش دهیم، فیلتر محصول وارد محاسبه میشود.
اینجا با Filter Context سروکار داریم.
بنابراین:
| مفهوم | سؤال اصلی |
|---|---|
| Row Context | الان روی کدام ردیف هستم؟ |
| Filter Context | کدام دادهها در محاسبه باید در نظر گرفته شوند؟ |
آیا Measure دارای Row Context است؟
یکی از اشتباهات رایج هنگام شروع DAX این است که تصور کنیم هر Measure بهصورت خودکار روی یک ردیف اجرا میشود.
اینطور نیست.
یک Measure بهصورت خودکار Row Context ایجاد نمیکند.
برای مثال:
Total Sales =
SUM(Sales[Sales Amount])
این Measure بهخودیخود نمیگوید:
«من الان در ردیف سوم جدول هستم.»
بلکه بر اساس Filter Context فعلی محاسبه میشود.
این تفاوت زمانی بسیار مهم میشود که بخواهیم از توابع Iterator استفاده کنیم.
Iterator چیست و چه ارتباطی با Row Context دارد؟
یکی از مهمترین نکات برای درک Row Context، آشنایی با Iteratorهاست.
توابعی مانند:
SUMX
AVERAGEX
MINX
MAXX
FILTER
در بسیاری از سناریوها دادهها را ردیفبهردیف بررسی میکنند.
برای مثال فرض کنید در جدول فروش، ستون Amount نداریم و فقط این دو ستون وجود دارند:
Quantity
Unit Price
اگر بخواهیم مجموع مبلغ فروش را محاسبه کنیم، میتوانیم بنویسیم:
Total Sales =
SUMX(
Sales,
Sales[Quantity] * Sales[Unit Price]
)
اینجا SUMX جدول Sales را ردیفبهردیف بررسی میکند.
برای هر ردیف:
Quantity × Unit Price
محاسبه میشود و سپس نتایج با هم جمع میشوند.
اینجاست که مفهوم Row Context اهمیت زیادی پیدا میکند.
تفاوت SUM و SUMX از دید Context
این مثال ارتباط خوبی با مقاله قبلی ما درباره تفاوت SUM و SUMX در Power BI دارد.
اگر ستونی به نام Amount داشته باشیم:
Total Sales =
SUM(Sales[Amount])
اما اگر مبلغ هر ردیف از حاصلضرب تعداد و قیمت ایجاد شود:
Total Sales =
SUMX(
Sales,
Sales[Quantity] * Sales[Unit Price]
)
SUMX در هر ردیف Expression را ارزیابی میکند و سپس نتایج را با هم جمع میکند.
بنابراین درک Row Context کمک میکند بفهمیم چرا SUMX در چنین سناریویی کاربرد دارد.
یک مثال واقعیتر؛ محاسبه سود هر سفارش
فرض کنید جدول فروش شامل این ستونهاست:
OrderID
Product
Quantity
Unit Price
Unit Cost
میخواهیم سود هر ردیف را محاسبه کنیم:
Profit =
Sales[Quantity] *
(Sales[Unit Price] - Sales[Unit Cost])
این فرمول اگر بهعنوان Calculated Column ساخته شود، برای هر ردیف اجرا میشود.
اما اگر بخواهیم سود کل را بهصورت Measure محاسبه کنیم، میتوانیم از SUMX استفاده کنیم:
Total Profit =
SUMX(
Sales,
Sales[Quantity] *
(Sales[Unit Price] - Sales[Unit Cost])
)
در اینجا SUMX باعث میشود Expression برای ردیفهای جدول ارزیابی شود.
Filter Context از کجا وارد میشود؟
حالا یک نکته جالبتر.
فرض کنید Measure زیر را داریم:
Total Profit =
SUMX(
Sales,
Sales[Quantity] *
(Sales[Unit Price] - Sales[Unit Cost])
)
اگر کاربر در گزارش سال 1404 را انتخاب کند، آیا SUMX تمام دادههای جدول را محاسبه میکند؟
خیر.
Filter Context ایجادشده توسط گزارش روی دادههایی که وارد محاسبه میشوند اثر میگذارد.
مثلاً اگر Slicer سال روی 1404 باشد، محاسبه Measure بر اساس دادههای باقیمانده در Context انجام میشود.
پس ممکن است در یک Measure هم با Filter Context مواجه باشیم و هم در داخل Iterator با Row Context.
این یکی از مهمترین نکاتی است که باید هنگام یادگیری DAX در ذهن داشته باشید.
CALCULATE چه نقشی در Filter Context دارد؟
اگر مقاله قبلی ما درباره CALCULATE را خوانده باشید، اینجا ارتباط موضوعات کاملاً مشخص میشود.
فرض کنید:
Total Sales =
SUM(Sales[Sales Amount])
حالا میخواهیم فروش آنلاین را محاسبه کنیم:
Online Sales =
CALCULATE(
[Total Sales],
Sales[Channel] = "Online"
)
CALCULATE شرایط محاسبه را تغییر میدهد و Filter Context جدیدی برای ارزیابی Expression ایجاد میکند.
بنابراین میتوان گفت:
CALCULATE یکی از مهمترین ابزارهای DAX برای تغییر Filter Context است.
اگر هنوز CALCULATE را مطالعه نکردهاید، بهتر است ابتدا آموزش آن را بخوانید و سپس دوباره به این بخش برگردید.
Filter Context و Slicer
یکی از بهترین راهها برای مشاهده Filter Context، استفاده از Slicer است.
فرض کنید داشبوردی داریم که فروش را نشان میدهد.
یک Slicer برای سال داریم:
1402
1403
1404
1405
اگر کاربر 1404 را انتخاب کند، Context گزارش تغییر میکند.
حالا اگر Measure زیر را داشته باشیم:
Total Sales =
SUM(Sales[Sales Amount])
مقدار Measure بر اساس دادههای مربوط به Context فعلی نمایش داده میشود.
اگر کاربر 1405 را انتخاب کند، نتیجه نیز تغییر میکند.
نکته مهم:
فرمول Measure تغییر نکرده است؛ Context تغییر کرده است.
این دقیقاً همان چیزی است که باعث قدرت Power BI در ساخت گزارشهای تعاملی میشود.
Filter Context و روابط بین جداول
Filter Context فقط از جدول Sales نمیآید.
فرض کنید مدل داده ما شامل این جداول است:
Customers
Products
Sales
Date
و بین آنها Relationship صحیح ایجاد کردهایم.
اگر کاربر در Slicer جدول Products یک دسته محصول را انتخاب کند، این انتخاب میتواند از طریق Relationship روی دادههای Sales اثر بگذارد.
در نتیجه Measure فروش نیز بر اساس Context جدید محاسبه میشود.
این موضوع یکی از دلایل اهمیت Data Modeling در Power BI است.
اگر Relationshipها اشتباه باشند، حتی یک Measure کاملاً صحیح ممکن است نتیجهای داشته باشد که انتظارش را ندارید.
آیا Row Context همان Filter Context است؟
خیر.
این دو مفهوم کاملاً یکسان نیستند.
Row Context به یک ردیف یا ردیف جاری مربوط است، در حالی که Filter Context مشخص میکند چه بخشی از داده در محاسبه مورد استفاده قرار گیرد.
برای مثال:
Sales[Quantity] * Sales[Unit Price]
در یک Calculated Column میتواند در Row Context اجرا شود.
اما:
SUM(Sales[Sales Amount])
به Filter Context فعلی برای تعیین دادههای مورد محاسبه وابسته است.
اشتباه رایج؛ فکر کردن به هر ردیف Visual بهعنوان Row Context
فرض کنید یک Table Visual داریم:
| شهر | فروش |
|---|---|
| تهران | 150M |
| مشهد | 120M |
ممکن است تصور کنیم:
«چون هر شهر در یک ردیف Visual قرار گرفته، پس Measure در Row Context اجرا شده است.»
این برداشت دقیق نیست.
ردیف Visual میتواند Filter Context ایجاد کند.
یعنی در ردیف تهران، فیلتر مربوط به تهران روی محاسبه Measure اعمال میشود.
این با Row Contextی که در Calculated Column یا Iterator داریم متفاوت است.
یک تمرین برای درک Context
برای اینکه این تفاوت کاملاً برایتان جا بیفتد، یک مدل ساده فروش ایجاد کنید.
جدول Sales:
| Date | City | Product | Quantity | Unit Price |
|---|---|---|---|---|
| 1404/01/05 | تهران | لپتاپ | 2 | 30M |
| 1404/01/07 | مشهد | لپتاپ | 1 | 30M |
| 1404/01/10 | تهران | مانیتور | 3 | 8M |
| 1404/02/02 | شیراز | پرینتر | 2 | 5M |
ابتدا این Calculated Column را بسازید:
Amount =
Sales[Quantity] * Sales[Unit Price]
اینجا Row Context را مشاهده میکنید.
سپس Measure زیر را ایجاد کنید:
Total Sales =
SUM(Sales[Amount])
حالا یک Table Visual بسازید و City را داخل آن قرار دهید.
در مرحله بعد یک Slicer برای Date یا سال اضافه کنید.
با انتخابهای مختلف Slicer مشاهده کنید که مقدار Measure چگونه تغییر میکند.
در این تمرین:
Calculated Column → Row Context
و
Measure + Slicer/Table → Filter Context
را بهصورت عملی مشاهده خواهید کرد.
چرا یادگیری Context برای DAX ضروری است؟
اگر Context را بهدرستی متوجه نشوید، در فرمولهای ساده ممکن است مشکلی نداشته باشید؛ اما با ورود به مباحث حرفهایتر، مشکلات شروع میشوند.
مثلاً وقتی به این توابع برسید:
CALCULATE
FILTER
SUMX
AVERAGEX
ALL
REMOVEFILTERS
KEEPFILTERS
RANKX
تقریباً دائماً با مفهوم Context سروکار خواهید داشت.
به همین دلیل بهتر است به جای حفظ کردن فرمولهای DAX، ابتدا منطق اجرای آنها را یاد بگیرید.
ارتباط Row Context و Filter Context با Context Transition
یکی از جذابترین مباحث DAX زمانی است که Row Context و Filter Context با یکدیگر ارتباط پیدا میکنند.
این اتفاق با مفهومی به نام:
Context Transition
شناخته میشود.
بهطور خلاصه، CALCULATE میتواند در شرایط مشخصی Row Context را به Filter Context تبدیل کند.
برای مثال این موضوع در بعضی سناریوهای Calculated Column، Iteratorها و Measureهای پیچیده اهمیت پیدا میکند.
اما Context Transition خودش یک موضوع مستقل و مهم است و بهتر است آن را جداگانه یاد بگیریم.
در مقاله بعدی از این مجموعه دقیقاً سراغ همین موضوع خواهیم رفت:
Context Transition در DAX چیست؟ CALCULATE چگونه Context را تغییر میدهد؟
جمعبندی
اگر بخواهیم تمام این مقاله را در چند جمله خلاصه کنیم:
Row Context یعنی محاسبه با توجه به ردیف جاری.
Filter Context یعنی مجموعه شرایط و فیلترهایی که مشخص میکنند چه دادههایی در محاسبه حضور داشته باشند.
Calculated Columnها معمولاً محیط مناسبی برای مشاهده Row Context هستند.
Measureها عمدتاً بر اساس Filter Context محاسبه میشوند.
Iteratorهایی مانند SUMX میتوانند در حین پیمایش ردیفها Row Context ایجاد کنند.
و CALCULATE یکی از مهمترین توابعی است که برای تغییر Filter Context استفاده میشود.
وقتی این مفاهیم را کنار هم قرار دهید، بسیاری از رفتارهای ظاهراً عجیب DAX دیگر عجیب نخواهند بود.
در واقع، یکی از تفاوتهای اصلی بین کسی که فقط فرمولهای DAX را حفظ کرده و کسی که DAX را واقعاً فهمیده، همین درک درست از Context است.
سؤالات متداول Row Context و Filter Context در DAX
Row Context در Power BI چیست؟
Row Context محیطی در DAX است که در آن یک ردیف مشخص از داده در حال ارزیابی است. این مفهوم در Calculated Columnها و Iteratorهایی مانند SUMX اهمیت زیادی دارد.
Filter Context در Power BI چیست؟
Filter Context مجموعه شرایطی است که تعیین میکند چه دادههایی هنگام محاسبه یک Expression یا Measure در نظر گرفته شوند. Slicerها، فیلترهای Visual و توابع DAX میتوانند در ایجاد یا تغییر آن نقش داشته باشند.
تفاوت Row Context و Filter Context چیست؟
Row Context بیشتر با ردیف جاری ارتباط دارد، در حالی که Filter Context مشخص میکند چه مجموعهای از دادهها در محاسبه حضور داشته باشند.
آیا Measure دارای Row Context است؟
Measure بهصورت خودکار Row Context ایجاد نمیکند. Measure معمولاً بر اساس Filter Context فعلی ارزیابی میشود. البته Iteratorها و برخی سناریوهای DAX میتوانند در جریان محاسبه Row Context ایجاد کنند.
آیا SUMX از Row Context استفاده میکند؟
SUMX یک Iterator است و Expression آن برای ردیفهای جدول ورودی ارزیابی میشود؛ بنابراین درک Row Context برای فهم عملکرد SUMX بسیار مهم است.
CALCULATE چه ارتباطی با Filter Context دارد؟
CALCULATE Expression را در Filter Context اصلاحشده ارزیابی میکند و به همین دلیل یکی از مهمترین ابزارهای DAX برای کنترل Context محاسبه است.
مقالات مرتبط آموزش Power BI و DAX
برای ادامه مسیر یادگیری پیشنهاد میکنیم این مقالات را نیز مطالعه کنید:
تفاوت Measure و Calculated Column در Power BI
برای آشنایی با تفاوت دو روش مهم محاسبه در Power BI.
تفاوت SUM و SUMX در Power BI
برای درک بهتر Iteratorها و محاسبات ردیفبهردیف.
آموزش تابع CALCULATE در Power BI
برای یادگیری تغییر Filter Context و ساخت Measureهای حرفهای.
آموزش تابع FILTER در Power BI (به زودی)
برای آشنایی با فیلتر کردن جدولها و استفاده از FILTER در DAX.
Context Transition در DAX چیست؟ (به زودی)
موضوع بعدی این مجموعه برای درک ارتباط Row Context و Filter Context.
درباره ایمان اشکاوند راد
مدیر فناوری و طراح و مشاور سیستم های نرم افزاری، مدرس دانشگاه با بیش از ۱۸ سال سابقه تدریس مهارت ها و دروس کامپیوتری در دانشگاه ها و شرکتهای مختلف، مولف مجموعه کتابهای بیت، تولید بسته های آموزشی کامپیوتر، علاقه مند به حوزه های پایگاه داده، BI، برنامه نویسی، اکسل و آفیس، مدیر انتشارات و آکادمی آموزشی اشکاوند
نوشتههای بیشتر از ایمان اشکاوند رادپست های مرتبط
31 شهریور 1405
30 شهریور 1405
29 شهریور 1405

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