استفاده از تابع SELECTEDVALUE در DAX
این مقاله توضیح میدهد که چگونه تابع SELECTEDVALUE
در DAX میتواند نگارش کد را در بسیاری از سناریوهایی که نیاز به خواندن یک مقدار انتخابشده در context فیلتر دارند، سادهتر کند.
زبان DAX به مرور زمان و با بهروزرسانیهای ماهانه Power BI توسعه پیدا کرده است. این بهروزرسانیها بهتدریج ویژگیهای جدیدی را معرفی میکنند که بعداً در Analysis Services و Power Pivot نیز در دسترس قرار میگیرند. تابع SELECTEDVALUE
در جولای ۲۰۱۷ معرفی شد و در Power BI Desktop و Analysis Services قابل استفاده است، اما هنوز در Power Pivot برای Excel پشتیبانی نمیشود.
تابع SELECTEDVALUE
یک قابلیت جدید به زبان اضافه نکرده، بلکه فقط نگارش مورد نیاز در الگوهای رایج کدنویسی را سادهتر کرده است – همانطور که در مثالهای استفادهای که پس از توضیح سینتکس این تابع ارائه میشود، خواهید دید.
سینتکس تابع SELECTEDVALUE
تابع SELECTEDVALUE
مقدار یک ستون را که بهعنوان آرگومان اول به آن داده شده، بازمیگرداند اگر تنها یک مقدار در context فیلتر موجود باشد. در غیر این صورت، مقدار خالی (BLANK()
) یا مقدار پیشفرضی را که بهعنوان آرگومان دوم مشخص شده، برمیگرداند.
در ادامه چند نمونه از سینتکس ممکن این تابع را میبینید:

درونساختاری، تابع SELECTEDVALUE
صرفاً یک میانبُر (syntax sugar) است که معادل نگارشهای زیر را تولید میکند:

شما باید از تابع SELECTEDVALUE
در تمام مواردی استفاده کنید که نیاز دارید یک مقدار انتخابشده در context فیلتر را بخوانید، و در سایر شرایط، یا مقدار خالی (BLANK()
) یا یک مقدار پیشفرض دیگر را دریافت کنید.
مهم است که به نکات زیر توجه داشته باشید:
توابع
SELECTEDVALUE
وVALUES
، context فیلتر فعلی را میخوانند، نه context سطر؛زمانی که context سطری (row context) دارید، فقط از یک ارجاع به ستون استفاده کنید (و در صورتی که ستون در جدول lookup باشد، از
RELATED
استفاده کنید)؛اگر context فیلتر هیچ سطری برای ستون ارجاعشده بازنگرداند، در این صورت
SELECTEDVALUE
آرگومان دوم را بازمیگرداند – تصور نکنید که آرگومان دوم فقط زمانی بازگردانده میشود که دو یا چند مقدار انتخاب شده باشند؛اگر از نسخهای از DAX استفاده میکنید که تابع
SELECTEDVALUE
را ندارد، میتوانید از همان الگویی که در این مقاله توضیح داده شده استفاده کنید، با این تفاوت که بهجایSELECTEDVALUE
از ترکیبHASONEVALUE
وVALUES
استفاده کنید.


این معیار زمانی مفید است که از یک ماتریس (Matrix) یا جدول محوری (Pivot Table) برای پیمایش استفاده میکنید. با این حال، این معیار حتی برای محصولاتی که هیچ فروشی ندارند نیز داده نمایش میدهد. این اتفاق در نسخههای قدیمیتر Power BI زمانی که از visual نوع Table استفاده میکردید، رخ نمیداد؛ اما از مارس ۲۰۲۴ به بعد، رفتار مطابق همان چیزی است که قبلاً توصیف شد. ما دقیقاً نمیدانیم این تغییر از چه زمانی اعمال شده، زیرا مقاله پس از انتشار، تغییرات نسخهها را پوشش نداده است.

اگر میخواهید کلاس یک محصول فقط زمانی نمایش داده شود که معیار (Measure) دیگری داده بازگرداند، باید یک شرط اضافه کنید، مانند یکی از دو مثال زیر:


بازیابی یک ستون از جدول مرجع (Lookup Table)
اگر بخواهید ویژگی مربوطه را از یک جدول مرجع (lookup table) بازیابی کنید، احتمالاً باید انتشار context فیلتر از طریق روابط را اصلاح کنید.
زمانی که row context دارید، میتوانید با استفاده از یک تابع RELATED
، مقدار متناظر را از جدول lookup بازیابی کنید، بدون توجه به تعداد روابطی که باید طی شوند.
به عنوان مثال، در نظر بگیرید حالتی را که یک بُعد بهصورت snowflake طراحی شده و شامل جداول Product، Product Subcategory و Product Category باشد. اگر بخواهید دستهبندی (Category) فعلی یک محصول را در یک ماتریس یا PivotTable نمایش دهید، به کد زیر نیاز دارید:

در این حالت، یک نگارش سادهتر میتواند همان باشد که توسط جدول گسترشیافته (expanded table) ارائه میشود:

با این حال، به یاد داشته باشید که جدول گسترشیافته ممکن است در مدلهای داده پیچیده اثرات جانبی ناخواستهای داشته باشد، بنابراین راهحل CROSSFILTER باید ترجیح داده شود. هر دو معیار همان نتیجه را باز میگردانند.

استفاده از یک ستون عددی در محاسبات
تابع SELECTEDVALUE
نگارش مورد نیاز هنگام استفاده از یک ستون عددی از یک موجودیت بهعنوان پارامتر در محاسبات را سادهتر میکند. به عنوان مثال، معیار زیر مقدار فروش را با تقسیم معیار موجود Sales Amount بر مقدار Unit Price محصول انتخابشده محاسبه میکند. در صورتی که چندین محصول انتخاب شده باشند، نتیجه خالی (BLANK()
) تابع SELECTEDVALUE
بهطور خودکار به نتیجه محاسبهشده در Calc Quantity
منتقل میشود.


الگوی جدول پارامتر
اگر الگوی جدول پارامتر را در نظر بگیرید، میتوانید یک معیار را با استفاده از پارامتر با نوشتن کد زیر و استفاده از SELECTEDVALUE
پیادهسازی کنید:

بجای آن:

نتیجه همان است، شما فقط کد خود را سادهتر کردهاید.

اگر میخواهید از انتخابهای متعدد جلوگیری کنید، میتوانید از تابع ERROR
استفاده کنید تا نمایش بصری (visual) پیامی مناسب بهعنوان خطا نشان دهد (حتی اگر ارجاع به MdxScript در یک محیط DAX مانند Power BI Desktop منطقی به نظر نرسد).


SELECTEDVALUE با پارامترهای فیلد در Power BI
ویژگی Fields Parameters در Power BI یک slicer ایجاد میکند که نمیتوان آن را با استفاده از SELECTEDVALUE
خواند، زیرا بهطور داخلی این جدول از ویژگی Group By Columns مدل Tabular استفاده میکند.
تابع SELECTEDVALUE
از بازیابی دادهها از ستونی که بر اساس ستونهای دیگر گروهبندی شده پشتیبانی نمیکند، زیرا تمام ستونهای درگیر باید در یک عملیات گروهبندی DAX مشابه (مانند SUMMARIZE
یا SUMMARIZECOLUMNS
) گنجانده شوند.
کدی که برای جایگزینی SELECTEDVALUE
برای ستونی که در جدول ایجاد شده توسط Fields Parameter نمایش داده میشود، به صورت زیر است:

ملاحظات عملکرد
تابع SELECTEDVALUE
هیچ برنامهی کوئری متفاوتی نسبت به نگارش گسترشیافته که از HASONEVALUE
و VALUES
استفاده میکند، تولید نمیکند. هم HASONEVALUE
و هم SELECTEDVALUE
بهطور داخلی رفتاری مشابه با درخواست DISTINCT
یا DISTINCTCOUNT
دارند: تمام این توابع ممکن است تعداد درخواستهای موتور ذخیرهسازی را افزایش دهند، زمانی که برای چندین سلول که در یک context فیلتر محاسبه میشوند و از طریق روابط محدود بهجای روابط معمولی منتقل میشوند، فراخوانی شوند.
به همین دلیل، مهم است که از SELECTEDVALUE
یا یک سینتکس معادل فقط در محاسبات سطح بالا استفاده کنید و نه در معیارهایی که اغلب داخل تکرارهای بزرگ ارزیابی میشوند.
نتیجهگیری
تابع SELECTEDVALUE
نگارش یک الگوی رایج که شامل دو تابع (HASONEVALUE
و VALUES
) برای بازیابی یک مقدار از context فیلتر را ساده میکند. فقط به یاد داشته باشید که این تکنیک زمانی که row context دارید ضروری نیست، زیرا میتوانید به راحتی از ارجاع به ستون و تابع RELATED
زمانی که یک جدول lookup درگیر است، استفاده کنید.
دیدگاهتان را بنویسید