معرفی جامع و کامل فرمول نویسی DAX
DAX مخفف عبارت Data Analysis Expression، یک زبان فرمولنویسی است که در Analysis Services ،Power BI Desktop در SQL Server و Power Pivot در Excel، با هدف تحلیل دادهها مورد استفاده قرار میگیرد. فرمولهای DAX شامل توابع (Functions)، اپراتورها (Oprators) و مقادیر (Values) برای انجام محاسبات پیشرفته و تحلیل دادهها در جداول و ستونهای مرتبط در مدلهای داده Tabular هستند. به تازگی متغیرها (Variables) نیز به این اجزا اضافه شده اند. در این مطلب قصد داریم همه چیز درباره فرمول نویسی DAX را در قالب دید کلی به شما ارائه کنیم.
محاسبات (Calculations)
فرمولهای محاسباتی DAX در مژرها، ستونهای محاسباتی، جداول محاسباتی و فیلترهای سطری استفاده میشوند.
Measures
Measure ها فرمولهای محاسباتی پویا هستند که نتیجه آنها بستگی به شرایط تغییر میکند. Measureها با استفاده از نوار فرمول DAX ایجاد میشوند.
یک فرمول در یک Measure میتواند از توابع تجمعی استاندارد مانند COUNT یا SUM استفادهکند بدین معنی که با انتقال ستون عددی مورد نظر خود به Values در نمودار ها فرمول های تجمعی پیش فرض Power BI برای آن قابل استفاده خوهد بود، یا اینکه فرمول را با استفاده از نوار فرمول DAX تعریف کرد. Measureها میتوانند بهعنوان یک آرگومان به سایر مژرها نیز منتقل شوند.
هنگامیکه در Formula Bar، یک فرمول برای Measure تعریف میشود نتایج قابلرؤیت نیستند. علت اینکه نمیتوانیم نتایج محاسبه را بلافاصله ببینیم این است که نتیجۀ Measure را نمیتوان بدون Context تعیین کرد، یعنی باید بخشی یا تمام داده ها برای این مژر ارسال شود تا نتیجه آن مشخص شود. برای ارزیابی یک مژر نیاز به ابزاری هست که میتواند Context موردنیاز برای بازیابی دادههای مربوط به هر سلول فراهم کند و سپس فرمول (Expression) هر سلول را ارزیابی کند. این ابزار می تواند یک Excel PivotTable یا PivotChart، یک گزارش Power BI یا table expression در یک فرمول DAX باشد.
صرفنظر از ابزار نمایشی، برای نتایج در هر سلول یک کوئری جداگانه اجرا میشود. بدین معنی است که هر ترکیبی از هدرهای سطر و ستون در یک PivotTable یا هر Slicer و فیلتر در گزارش Power BI، یک زیرمجموعه متفاوت از دادهها که مژر بر اساس آن محاسبه میشود تولید میکنند. به عنوان مثال در این فرمول ساده:
هنگامیکه کاربر ابتدا مژرِ TotalSales در پنجره Values را در یک PivotTable و سپس ستون Product Category در جدول Product را در پنجره Filters، قرار میدهد، مجموع Sales Amount برای هر دسته محصول محاسبه و نمایش داده میشود.
برخلاف ستونهای محاسبهشده و فیلترهای سطری، نوشتار یک مژر شامل نام آن قبل از فرمول است. در مثال فوق نام Total Sales قبل از فرمول ظاهر میشود. بعدازاینکه مژر ساخته شود، نام و تعریف آن در لیست فیلدهایی که در ساخت گزارش برنامه موردنظر موجود است ظاهر میشود و بسته به perpectiveها و نقشها برای همه کاربران مدل در دسترس است.
ستونهای محاسباتی (Calculated Columns)
یک ستون محاسباتی، ستونی است که به یک جدول موجود اضافه شده و سپس یک فرمول DAX برای تعریف مقادیر این ستون تعریف میشود. ازآنجاکه یک ستون محاسباتی در یک جدول در مدل داده ایجاد میشود، این ستونها در مدلهایی که دادهها را صرفاً از یک منبع داده رابطهای با استفاده از حالت DirectQuery بازیابی میکنند، پشتیبانی نمیشوند.
هنگامیکه یک ستون محاسباتی ایجاد می کنیم مقادیر برای هر سطر به محض تایید نهایی فرمول محاسبه میشوند و سپس مقادیر درحافظه ذخیره میشوند. بهعنوانمثال، در یک جدول تاریخ (Date table)، زمانی که فرمول در نوار فرمول واردشده است به صورت زیر میباشد:
مقدار برای هر سطر در جدول با در نظر گرفتن مقادیر از ستون Calendar Year (در همان جدول تاریخ)، با اضافه کردن فاصله و حرف بزرگ Q، و سپس افزودن مقادیر از ستون Calendar Quarter (در همان جدول تاریخ) محاسبه میشود. نتیجه هر سطر در ستون محاسباتی فوراً محاسبه شده و به عنوان مثال مانند 2017 Q1 ظاهر میشود. مقادیر ستون فقط درصورتی که جدول یا هر جدول مربوطه پردازش شود، دوباره محاسبه میشود یا مدل از حافظه خارج میشود و پسازآن دوباره بارگذاری میشود، مانند بستن و بازگشایی فایل Power BI Desktop.
جداول محاسباتی (Calculated Tables)
یک جدول محاسباتی جدولی است که بر اساس یک عبارت یا فرمول DAX ایجادشده، که از تمام یا بخشی از جداول دیگر در همان مدل مشتق شده است. به جای کوئری زدن و بارگذاری مقادیر در ستونهای جدول جدید خود از منبع داده، یک فرمول DAX مقادیر جدول را تعریف میکند. جداول محاسبهشده نقش مهمی داشته و کاربردی میباشند. مثلا در جدول تاریخ ها موضوعاتی مانند OrderDate، ShipDate یا DueDate.
با ایجاد یک جدول محاسبهشده برای ShipDate، یک جدول جداگانهای برای کوئریها دریافت میکنیم که مانند هر جدول دیگر کاملاً قابلاستفاده است. جداول محاسباتی برای اعمال فیلتر سطرها و ستونها نیز مفید هستند. این به ما اجازه میدهد که جدول اولیه را بدون تغییر نگهداریم درحالی که با ایجاد حالتهای گوناگونی از آن، میتوان سناریوهای خاصی را ایجاد کرد.
جداول محاسباتی روابط با جداول دیگر را پشتیبانی میکنند. ستونهای جدول محاسباتی انواع داده و قالببندی را دارند و میتوانند به یک دسته داده متعلق باشند. جداول محاسباتی میتوانند نامگذاری شده و درست مانند هر جدول دیگری در معرض دید بوده و یا پنهان شوند. اگر جدولی که از آن داده گرفتهشده تغییر کند و بهروز شود، جدول محاسباتی نیز مطابق با آن تغییرات دوباره محاسبه میشود.
برای اطلاعات بیشتر به آدرسهای زیر مراجعه کنید:
Calculated tables in Power BI Desktop
Calculated tables in Analysis Services
فیلترهای سطری (Row Filters)
در فیلترهای سطری که بهعنوان Row-Level Security شناخته میشوند، یک فرمول DAX باید شرط TRUE / FALSE بودن را ارزیابی کند و همچنین تعیین میکند که کدام یک از سطرها با توجه به شرطی که مقررشده (نقش خاصی که در نظر گرفتهشده) میتوانند برگردانده شوند. برای مثال، برای اعضای نقش Sales، جدول مشتری با فرمول DAX زیر تعیینشده:
بهطوریکه تنها اعضای فروش قادر به مشاهده دادههای مشتریان ایران هستند. بهعنوانمثال SUM، فقط برای مشتریانی که در ایران میباشند برگردانده میشود. فیلترهای سطری در Power Pivot در Excel پشتیبانی نمی شوند.
هنگامیکه با استفاده از یک فرمول DAX، یک فیلتر سطری تعریف میشود در واقع مجموعه مُجازی از سطرها را ایجاد میکنیم. سایر نقشها میتوانند به سطوح حذفشده توسط فرمول DAX دسترسی داشته باشند. اگر کاربر یک عضو از یک نقش دیگر است و فیلترهای ردیف آن اجازه دسترسی به آن ردیف خاص را میدهد، کاربر میتواند اطلاعات مربوط به آن سطر را مشاهده کند. فیلتر سطری به سطرهای مشخصشده و همچنین سطرهای مربوطه اعمال میشود. هنگامیکه یک جدول روابط چندگانه دارد، فیلترها امنیت را برای رابطه فعال میکنند.
کوئریها (Queries)
کوئریِ DAX را میتوان در (SQL Server Management Studio (SSMS و ابزارهای open-source مانند DAX Studio ایجاد و اجرا کرد. برخلاف حالت داخلی نرم افزارها که فقط میتواند در مدل Tabular ایجاد شود، نمایش دادههای DAX نیز میتواند بر روی مدلهای Multidimensional در Analysis Services اجرا شود. کوئری DAX اغلب سادهتر از نوشتن کوئریهای Multidimensional Data Expressions) MDX) است.
کوئریِ DAX شبیه به عبارت SELECT در T-SQL هست. اساسیترین نوع کوئریِ DAX یک عبارت evaluated است. مثلاً:
EVALUATE (
FILTER ( ‘DimProduct’, [SafetyStockLevel] < 200 ) )
ORDER BY [EnglishProductName] ASC
در این مثال تنها محصولاتی که مقدار ِSafetyStockLevel آنها کمتر از 200 هست برگردانده میشود. حتما متوجه شده اید که ProductNameها بهصورت صعودی مرتبشدهاند. مژرها میتوانند بهعنوان بخشی از کوئری ایجاد شوند و فقط برای مدتزمان کوئری وجود دارند. برای کسب اطلاعات بیشتر، اینجا را ببینید.
فرمولها (Formulas)
فرمولهای DAX برای ایجاد محاسبات در ستونهای محاسبهشده و Measure ها و ایمن کردن دیتا با استفاده از فیلترهای سطری ضروری هستند. برای ایجاد فرمولهای ستونها و مژرهای محاسبهشده، میتوان از نوار فرمول در بالای پنجره طراح مدل یا Editor DAX و برای ایجاد فرمول برای فیلترهای سطر، باید از کادر محاورهای Role Manager استفاده کرد. تا Feb 2019 تعداد 269 تابع در زبان DAX پشتیبانی می شود. اطلاعات موجود در این بخش به شما کمک میکند تا با درک مبانی فرمولهای DAX آشنا شوید.
اصول فرمول (Formula basics)
فرمولهای DAX میتوانند خیلی پیچیده و یا ساده باشند. جدول زیر برخی از نمونه های فرمولهای سادهای که در یک calculated column استفاده میشود را نمایش میدهد:
فرمول | توضیحات |
---|---|
=TODAY() | در هر سطر از یک ستون محاسبه شده تاریخ امروز را درج میکند. |
=3 | =3 |
= [Column1] + [Column2] | مقادیر موجود در سطر یکسانی از ستون 1 و 2 را جمع میکند و نتایج را در ستون محاسبه شده موجود در سطر یکسان قرار میدهد. |
فرمولها چه ساده باشند یا پیچیده برای ایجاد آنها باید گامهای زیر را طی کرد:
1- هر فرمولی باید با علامت = شروع شود.
2- میتوان نام تابع را تایپ کرده و یا انتخاب کنیم.
3- با شروع به تایپ چند حرف اول، تابع یا نام موردنظر خود را میتوانیم انتخاب کنیم، AutoComplete فهرستی از توابع موجود، جداول و ستونها را نمایش میدهد. با فشردن TAB یک مورد از لیست AutoComplete به فرمول اضافه میشود. همچنین با کلیک بر روی Fx یک لیست از توابع موجود نمایش داده میشود. برای انتخاب یک تابع از لیست کشویی تابع را به فرمول اضافه کنید.
4- آرگومانهای مربوط به تابع با انتخاب آنها از یک لیست کشویی جداول و ستونهای احتمالی، فراهم میشود.
5- بررسی خطاهای دستوری: باید اطمینان حاصل کرد که تمامی پرانتزها بسته هستند و ستونها، جداول و مقادیر به درستی ارجاع شوند.
6- برای اعمال کردن فرمول، از کلید ENTER میتوانیم استفاده کنیم.
نکته:
در این مثال، بیایید نگاهی بندازیم به یک فرمول در یک مژر به نام Days in Quarterly Current:
این مژر برای ایجاد نسبت مقایسهای بین یک دوره کامل نشده و دوره قبلی استفاده میشود. فرمول باید نسبت مدتزمان سپریشده را حساب کند و آن را نسبت به همان نسبت در دوره قبلی مقایسه کند. در این مورد، [Days Current Quarter to Date] / [Days in Quarter Current] نسبت سپریشده در دوره زمانی فعلی را میدهد.
این فرمول شامل عناصر زیر میباشد:
عناصر فرمول | توضیحات |
---|---|
Days in Current Quarter | نام Measure |
= | علامت مساوی برای شروع نوشتن فرمول میباشد. |
COUNTROWS | تعداد سطرهای جدول Date را میشمارد. |
() | پرانتز باز و بسته برای مشخص کردن متغیرها |
DATESBETWEEN | تابعی است که تاریخ های بین آخرین تاریخ هر مقدار در ستون Date موجود در جدول Date را برمیگرداند. |
‘Date’ | به عنوان جدول Date مشخص شده است. |
[Date] | به عنوان ستون Date در جدول Date تعیین شده است. |
, | |
STARTOFQUARTER | تابعی که تاریخ 3 ماه اول را برمیگرداند. |
LASTDATE | تابعی که تاریخ 3 ماه آخر را برمیگرداند. |
‘Date’ | به عنوان جدول Date مشخص شده است. |
[Date] | به عنوان ستون Date تعیین شده است. |
, | |
>ENDOFQUARTER | تابع ENDOFQUARTER |
‘Date’ | به عنوان جدول Date مشخص شده است. |
[Date] | به عنوان ستون Date تعیین شده است. |
استفاده از فرمول AutoComplete
هر دو نوار فرمول در طراح مدل و پنجره فرمول فیلترهای سطر در کادر role manager یک ویژگی AutoComplete را فراهم میکنند. AutoComplete با فراهم کردن انتخابهایی برای هر عنصر در فرمول کمک میکند که یک فرمول صحیح را ایجاد کنید:
- فرمول AutoComplete در وسط یک فرمول موجود با توابع توزیع شده قابل استفاده است. متن بلافاصله قبل از نقطه درج برای نمایش مقادیر در لیست کشویی مورداستفاده قرار میگیرد و تمام متن بعد از نقطه درج بدون تغییر باقی میماند.
- AutoComplete پرانتزهای بسته توابع را اضافه نمیکند و بهصورت خودکار پرانتزها را مطابقت نمیدهد. پس باید اطمینان حاصل کرد که هر تابع ازنظر دستوری درست باشد وگرنه فرمول را نمیتوانیم ذخیره کنیم.
استفاده از توابع تو در تو در یک فرمول
توابع را میتوان بهصورت تودرتو نیز اعمال کرد، به این معنی که از نتایج یک تابع بهعنوان یک آرگومان در تابع دیگر استفاده کنیم. به صورتی که میتوان تا 64 سطح تابع را در ستونهای محاسباتی قرار داد. بااینحال، این تودرتو بودن میتواند ساخت فرمول را با سخت کند. بسیاری از توابع طراحیشدهاند که فقط بهعنوان توابع لانهای مورداستفاده قرار میگیرند. این توابع یک جدول را بازگردانی میکند که بهعنوان نتیجه نمیتواند بهصورت مستقیم ذخیره شود. باید بهعنوان یک ورودی برای تابع جدول ارائه شود. بهعنوانمثال، توابع SUMX، AVERAGEX و MINX و … همه یک جدول را بهعنوان اولین آرگومان نیاز دارند.
توابع (Functions)
DAX شامل توابعی هست که میتوانید از آنها برای انجام محاسبات با استفاده از تاریخ و زمان، ایجاد مقادیر شرطی، کار با رشتهها، انجام بررسیها بر اساس روابط و توانایی تکرار در جدول برای انجام محاسبات بازگشتی استفاده کنید. بسیاری از این توابع بسیار مشابه با فرمولهای اکسل میباشند؛ بااینحال، فرمولهای DAX ویژگی های خاصی دارند:
- یک تابع DAX همواره به یک ستون کامل یا یک جدول اشاره میکند. اگر میخواهید از مقادیر خاصی از یک جدول یا ستون استفاده کنید، میتوانید فیلترها را به فرمول اضافه کنید.
- در صورت نیاز به انجام محاسبات به شکل سطر به سطر، DAX توابعی را فراهم میکند که اجازه میدهد از مقدار سطر فعلی یا مقداری مرتبط بهعنوان نوعی پارامتر استفاده کرد تا محاسباتی را که از لحاظ context باهم متفاوتاند را انجام دهد. برای درک اینکه چگونه این توابع کار میکنند، ادامه مطلب را مطالعه کنید.
- DAX شامل بسیاری از توابع است که یک جدول را به جای یک مقدار برمیگرداند. جدول در گزارش نمایش داده نمیشود، بلکه برای ارائه ورودی به سایر توابع استفاده میشود. بهعنوانمثال، شما میتوانید یک جدول را بازیابی کنید و سپس مقادیر مجزا را در سراسر جداول یا ستونهای فیلتر شده محاسبه کنید.
- توابع DAX شامل انواع مختلفی از توابع time-intelligence هستند. این توابع اجازه تعریف یا انتخاب محدودههای تاریخ را میدهد و محاسبات پویا را بر اساس این تاریخها یا محدوده انجام میدهد.
توابع تاریخ و زمان (Date and Time functions)
توابع تاریخ و زمان در DAX شبیه به توابع تاریخ و زمان در مایکروسافت اکسل هستند. بااینحال، توابع DAX بر اساس نوع داده datatime استفادهشده توسط Microsoft SQL Server است.
توابع فیلتر (Filter functions)
توابع فیلتر در DAX نوع خاصی از داده را برمیگردانند، مقادیر را در tail مربوطه جستجو میکنند و با مقادیر مرتبط فیلتر میکنند. توابع lookup با استفاده از جداول و روابط، مانند یک پایگاه داده کار میکنند. این توابع امکان دستکاری زمینه (context) داده را فراهم میکنند تا محاسبات پویا ایجاد کنید.
توابع اطلاعاتی (Information functions)
یک تابع اطلاعاتی، اطلاعاتی در مورد سلول یا سطری که به عنوان یک آرگومان ارائه میشود، بصورت True یا False بر می گرداند. بهعنوانمثال، تابع ISERROR، اگر مقداری که موجود است خطایی داشته باشد TRUE را برمیگرداند.
توابع منطقی (Logical functions)
توابع منطقی بر روی یک عبارت کار میکنند. بهعنوان مثال، تابع TRUE اجازه میدهد تا بدانیم که آیا عبارتی که در حال ارزیابی آن هستیم، مقدار TRUE را نشان میدهد.
توابع ریاضی و مثلثاتی (Mathematical and Trigonometric functions)
توابع ریاضی DAX بسیار شبیه توابع ریاضی و مثلثاتی اکسل هستند. برخی از تفاوتهای جزئی در انواع دادههای عددی استفادهشده توسط توابع DAX وجود دارد.
سایر توابع (Other functions)
این توابع اقدامات منحصربهفردی را انجام میدهند؛ که توسط هیچ دستهای که بیشتر توابع به آنها متعلق هستند تعریف نمیشوند.
توابع آماری (Statistical functions)
DAX توابع آماری که عملیات تجمیعی را انجام میدهند ارائه میکند. علاوه بر ایجاد مجموع و میانگین، یا پیدا کردن حداقل و حداکثر مقادیر، در DAX همچنین امکان فیلتر کردن ستون قبل از تجمیع یک ستون فراهم میکند و یا aggregation هایی را بر اساس جداول وابسته میتوان ایجاد کرد.
توابع متنی (Text functions)
توابع متنی در DAX بسیار شبیه همتایان خود در اکسل هستند. میتوان بخشی از یک رشته را جستجو کرد، متن را در یک رشته جستجو کرد یا مقادیر رشته را پیوند داد. DAX همچنین توابعی برای کنترل فرمتهای تاریخ، زمان و اعداد را فراهم میکند.
توابع اطلاعات زمان (Time-Intelligence functions)
توابع time-intelligence ارائهشده در DAX امکان محاسباتی را میدهد که از اطلاعات تقویم و تاریخ استفاده میکنند. با استفاده از محدودههای زمانی و تاریخی همراه با محاسبات یا جمع، میتوان مقایسه معنیدار در دورههای زمانی قابلمقایسه برای فروش، موجودی و غیره ایجاد کرد.
توابع جدولی (Table-valued functions)
توابعی هستند که خروجی آنها جدول هست، جداول را به عنوان ورودی میگیرند یا هر دو را انجام میدهند. ازآنجاکه یک جدول میتواند یک ستون تک داشته باشد، توابع جدول ارزش نیز ستونهای تک را بهعنوان ورودی به کار میبرند. درک نحوه استفاده از توابع ارزشمند جدول برای استفاده کامل از فرمول DAX مهم است. DAX شامل توابع جدولی با انواع زیر است:
- توابع فیلتر کننده یک ستون، جدول یا مقادیر مربوط به سطر فعلی را نمایش میدهند.
- توابع جمع کننده، هر عبارت را بر روی سطر یک جدول جمع میکنند.
- توابع زمان، اطلاعات یک جدول از تاریخها را برمیگرداند یا از یک جدول تاریخ برای محاسبه جمع استفاده میکنند.
نمونههایی از توابع جدول عبارتاند از: FILTER، ALL، VALUES، DISTINCT، RELATEDTABLE.
متغیرها (Variables)
با استفاده از VAR میتوان متغیرها را در یک عبارت ایجاد کرد. VAR ازنظر فنی یک تابع نیست، یک کلمه کلیدی است که برای ذخیره نتیجه یک عبارت بهعنوان یک متغیر نامگذاری شده به کار میرود. سپس این متغیر میتواند بهعنوان یک آرگومان به سایر عبارات مژرها منتقل شود. مثلاً:
TotalQty = SUM ( Sales[Quantity] )
Return
IF ( TotalQty > 1000,
TotalQty * 0.95,
TotalQty * 1.25 )
در این مثال، TotalQty میتواند بهعنوان یک متغیر نامگذاری شده به سایر عبارات منتقل شود. متغیرها میتوانند از هر نوع داده اسکالر، ازجمله جداول باشند. استفاده از متغیرها در فرمولهای DAX شما میتواند فوقالعاده قدرتمند باشد.
انواع داده (Data types)
در یک مدل میتوان دادههایی را از منابع متفاوت که انواع مختلف داده را پشتیبانی میکند وارد کرد. وقتی دادهها را به یک مدل وارد میکنیم، دادهها به یکی از انواع دادههای جدولی تبدیل میشوند. هنگامیکه دادههای مدل در محاسبه استفاده میشود، دادهها سپس به نوع داده DAX برای مدتزمان و خروجی محاسبه تبدیل میشوند. هنگامیکه یک فرمول DAX ایجاد میشود، اصطلاحات استفادهشده در فرمول بهطور خودکار مقدار دادههای دادهشده بازگشتی را تعیین میکند.
DAX از انواع دادههای زیر پشتیبانی میکند:
نوع داده در مدل | نوع داده در DAX | توضیحات |
---|---|---|
اعداد کامل | 64 بیت | اعدادی که قسمت اعشار ندارند. اعداد صحیحی که میتوانند مثبت یا منفی باشند اما باید اعداد کاملی بین -9,223,372,036,854,775,808 و 9,223,372,036,854,775,807 باشند. |
اعداد اعشاری | 64 بیت | اعداد حقیقی اعدادی هستند که قسمت اعشاری دارند. اعداد حقیقی مقادیر گسترده ای را پوشش می دهند: مقادیر منفی از -1.79E +308 تا -2.23E -308 و 0 و اعداد مثبت از 2.23E -308 تا 1.79E + 308. |
بولی | بولین | مقدار آن True یا False می باشد. |
متن | رشته | یک رشته داده ای کاراکتر تک کدی. رشته، عدد یا تاریخ در فرمت متن |
تاریخ | تاریخ/زمان | تاریخ های معتبر مربوط به بعد از ، 1 مارچ 1900 می باشند. |
نرخ ارز | واحدپول | مقداری بین -922,337,203,685,477.5808 و 922,337,203,685,477.5807 میباشد. |
N/A | جای خالی | منظور همان null می باشد.با استفاده از تابع BLANK میتوان این نوع داده را فراهم کرد و برای تست کردن از تابع ISBLANK میتوان استفاده کرد. |
درحالیکه انواع دادهها معمولاً بهصورت خودکار تنظیم میشوند، مهم است که انواع دادهها را درک کنیم و آنها را بهطور خاص به فرمولهای DAX اعمال کنیم. برای مثال، خطاها در فرمولها یا نتایج غیرمنتظره اغلب با استفاده از یک اپراتور خاص که نمیتوان با نوع داده مشخصشده در یک آرگومان استفاده کرد، ایجاد میشود. بهعنوانمثال، فرمول = 1 & 2، نتیجه رشتهای 12 را بازمیگرداند. فرمول = “1” + “2”، بااینحال، یک نتیجه عدد صحیح از 3 را نشان میدهد. مدل دادههای جدولی همچنین شامل نوع داده جدول بهعنوان ورودی یا خروجی به بسیاری از توابع DAX است. بهعنوانمثال، تابع FILTER یک جدول را بهعنوان ورودی میگیرد و جدول دیگری را نمایش میدهد که تنها شامل سطرهایی است که شرایط فیلتر را دارند. با ترکیب توابع جدول با توابع تجمعی، شما میتوانید محاسبات پیچیده را بر مجموعه دادههای تعریفشده بصورت پویا انجام دهید.
Context
Context یک مفهوم مهم است که هنگام ایجاد فرمولهای DAX باید آن را درک کرد. context چیزی است که در هنگام انجام تحلیل پویا به ما کمک میکند، زیرا نتایج یک فرمول تغییر میکنند تا انتخاب سلول یا سطر فعلی و همچنین هر داده مرتبط را منعکس کنند. درک context و استفاده مؤثر از آن برای ایجاد تحلیلهای پویا و عیبیابی در فرمولها ضروری است.
فرمولهای موجود در مدلهای Tabular را میتوان در یک context متفاوت با توجه به سایر عناصر طراحی، ارزیابی کرد:
- فیلترهایی که در یک PivotTable یا گزارش بهکار رفتهاند.
- فیلترهایی که در یک فرمول تعریفشدهاند.
- روابطی که با استفاده از توابع خاص در یک فرمول مشخص شدهاند.
انواع مختلفی از context وجود دارد: row context، query context و filter context
Row Context
Row context را میتوان بهعنوان «سطر جاری» در نظر گرفت. اگر یک فرمول در یک ستون محاسبه ایجاد شود، row context برای آن فرمول شامل مقادیری از همه ستونها در سطر فعلی است. اگر جدول مربوط به جدول دیگری باشد، context نیز شامل تمام مقادیری از جدول دیگری است که در ارتباط با سطر فعلی است.
بهعنوانمثال، فرض کنید یک ستون محاسبهشده ایجاد کردهایم، = [Tax] + [Freight] که مقادیر دو ستون از یک جدول را باهم جمع میکند، حملونقل و مالیات. این فرمول بهطور خودکار مقادیر را فقط از سطر فعلی در ستونهای مشخصشده میگیرد.
Row context همچنین هر رابطهای که بین جداول تعریفشده است، مثل روابطی که در یک ستون محاسبهشده با استفاده از فرمول DAX تعریفشده را دنبال میکند تا تعیین کند که کدام سطرها در جداول مرتبط با سطر فعلی در ارتباط است.
بهعنوانمثال، فرمول زیر از تابع Related استفاده میکند تا بر اساس منطقهای که سفارش به آن منتقلشده است یک مقدار مالیاتی از یک جدول مرتبط بگیرد. مقدار مالیاتی با استفاده از مقدار region در جدول فعلی، جستجوی region در جدول مرتبط و سپس دریافت نرخ مالیات برای آن منطقه از جدول مرتبط تعیین میشود.
این فرمول نرخ مالیات برای منطقه فعلی را از جدول منطقه میگیرد و آن را به مقدار ستون حمل میافزاید.
Multiple Row Context
DAX شامل توابعی است که محاسبات بر روی یک جدول را تکرار میکند. این توابع میتوانند چندین سطر فعلی داشته باشند که هرکدام دارای row context خاص خود هستند. در اصل، این توابع اجازه میدهد فرمولهایی را ایجاد کنیم که عملیات را بهصورت بازگشتی بر روی یک حلقه درونی و بیرونی انجام میدهند.
بهعنوانمثال، فرض کنید مدل شامل جدول products و یک جدول sales است. کاربران ممکن است بخواهند وارد جدول sales که شامل معاملات مربوط به چندین محصول است، بشوند و بزرگترین مقدار سفارش شده را برای هر محصول در هر معامله پیدا کنند.
با DAX میتوان یک فرمول واحد را ایجاد کرد که مقدار صحیح را برگرداند و نتایج بهصورت خودکار هرزمانی که کاربر دادهها را به جداول اضافه میکند بهروز میشود.
FILTER(Sales, [ProdKey] = EARLIER([ProdKey]) ), Sales[OrderQty])
برای مثال دقیقتر از این فرمول، EARLIER را ببینید.
بهطور خلاصه، تابع EARLIER در واقع Row Context را از عملیات قبل از عملیات فعلی (از ردیف قبلی) ذخیره میکند. در هر زمان، تابع دو مجموعه از context را در حافظه ذخیره میکند: یک مجموعه از context، سطر فعلی را برای حلقه درونی فرمول نشان میدهد و مجموعه دیگری از context نشاندهنده رشته فعلی برای حلقه بیرونی فرمول است. DAX بهطور خودکار مقادیر بین دو حلقه را تأمین میکند بطوری که میتوان مجموعه ارقام پیچیدهتری را ایجاد کرد.
Query Context
Query context مربوط به زیرمجموعه داده است که بصورت ضمنی برای یک فرمول بازیابی میشود. هنگامیکه یک کاربر یک مژر یا یک فیلد دیگری که حاوی value میباشد را در PivotTable یا یک گزارش قرار میدهد، موتور عناوین سطر و ستون، Slicers ها و فیلترهای گزارش را برای تعیین context بررسی میکند. سپس، کوئری های لازم به منبع داده زده میشوند تا زیر مجموعههای صحیحی از داده را دریافت کرده، محاسباتی را توسط فرمول انجام دهند و سپس هر سلول را در PivotTable یا گزارش پر کنند. مجموعه دادههایی که بازیابی میشوند، query context برای هر سلول است. چون که context بستگی به اینکه کجا فرمول قرار داده شده، تغییر میکند، نتایج فرمول نیز همچنین میتواند تغییر کند.
بهعنوانمثال، فرض کنید یک فرمول را ایجاد میکنید که مقادیری را در ستون سود در جدول فروش به دست میآورد:
اگر از این فرمول در یک ستون محاسبهشده در جدول فروش استفاده کنید، نتایج حاصل از فرمول برای کل جدول یکسان خواهد بود، زیرا query context فرمول، همیشه مجموعه کل دادههای جدول sales است. نتایج برای تمامی مناطق، تمام محصولات، همهساله و غیره سود خواهد داشت.
بااینحال، کاربران معمولاً نمیخواهند یک نتیجه مشابه را صدها بار ببینند، بلکه میخواهند برای یک سال خاص، یک کشور خاص، یک محصول خاص یا ترکیبی از آنها سود ببرند و سپس مجموع کل را دریافت کنند.
در یک PivotTable ،context با افزودن یا حذف ستونها و سرتیتر ردیف و اضافه کردن یا حذف Slicer ها، میتواند تغییر کند. هر زمان که کاربران عناوین سطر یا ستون را به PivotTable اضافه میکنند، query context را که در آن اندازهگیری ارزیابی میشود، تغییر میدهد. عملیات برش (Slice) و فیلتر کردن نیز روی متن تأثیر میگذارد. بنابراین، همان فرمول مورد استفاده در یک مژر، در یک query context مختلف برای هر سلول ارزیابی میشود.
Filter Context
Filter context مجموعهای از مقادیر مجاز در هر ستون یا در مقادیر بازیابی شده از یک جدول مرتبط است. فیلترها را میتوان به ستون یا درگزارش و PivotTable ها اعمال کرد. فیلترها همچنین میتوانند به وضوح توسط filter expression ها در فرمول تعریف شوند.
Filter context وقتی بکار می رود که محدودیتهای فیلتر بر روی مجموعهای از مقادیر مجاز در ستون یا جدول مشخص می شود. Filter context در بالاترین سطر از context دیگر، مانند row context یا query context به کار میرود.
در Tabular Model ها، راههای زیادی برای ایجاد Filter context وجود دارد. در context مشتریانی که میتوانند از مدل استفاده کنند، مانند گزارشهای Power BI، کاربران میتوانند فیلترهایی را با اضافه کردن برشگرها یا فیلترهای گزارش در عناوین سطری و ستونی ایجاد کنند. همچنین میتوان عبارات فیلتر را به طور مستقیم در فرمول مشخص کرد، تا مقادیر مرتبط مشخص شوند، جداولی را که بهعنوان ورودیها استفاده میشوند فیلتر کنید، یا بهطور پویا برای مقادیری که در محاسبات استفاده میشود، context را به دست آورید. همچنین میتوانید فیلترها را در ستونهای خاص بهطور کامل یا به طور انتخابی پاک کنید. که این کار هنگام ایجاد فرمولهایی که مجموعهای بزرگ را محاسبه میکنند بسیار مفید است.
تعیین context در فرمولها
هنگامیکه یک فرمول DAX ایجاد میشود، فرمول برای اولین بار از لحاظ معتبر بودن نوشتار (از لحاظ دستوری) آزمایش می شود و سپس برای اطمینان از اینکه آیا نام ستونها و جداولی که در فرمول هستند می توانند در context فعلی پیدا شوند آزمایش می شود. اگر هیچ ستون یا جدولی که توسط فرمول شخصشده، یافت نشود، خطا بوجود میآید.
context در زمان اعتبار سنجی (عملیات مجدد) با استفاده از جداول موجود در مدل، هر رابطهای بین جداول و هر فیلتر که مورد استفاده قرارگرفته است، تعیین میشود. برای مثال، اگر فقط برخی از دادهها را به یک جدول جدید وارد کرده باشیم درحالی که آن را به هیچیک از جداول دیگر مرتبط نسازیم (و شما هیچ فیلتری را اعمال نکردهاید)، context فعلی مجموعه کامل ستونها در جدول است. اگر جدول با جداول دیگر ارتباط داشته باشد، context فعلی شامل جداول مربوطه میشود. اگر یک ستون از جدول را به گزارشی که Slicer ها و شاید برخی از فیلترهای گزارش را دارد، اضافه کنید، context فرمول زیرمجموعه داده در هر سلول گزارش است.
context یک مفهوم قدرتمند است که همچنین میتواند عمل عیبیابی فرمولها را مشکل سازد. ما توصیه میکنیم که با فرمولها و روابط ساده شروع کنید تا ببینید که context چگونه کار میکند. بخش زیر برخی نمونههای نحوه استفاده از انواع مختلف context را برای به دست آوردن نتایج بهصورت پویا ارائه میدهد.
اپراتورها (Operators)
زبان DAX از چهار نوع مختلف اپراتورهای محاسبه در فرمول استفاده میکند:
- اپراتورهای مقایسه برای مقایسه مقادیر و بازگشت ارزش منطقی TRUE \ FALSE.
- اپراتورهای حسابی برای انجام محاسبات محاسباتی که مقادیر عددی را ارائه میدهند.
- اپراتورهای پیوند متن برای پیوستن به دو یا چند رشته متن.
- اپراتورهای منطقی که دو یا چند عبارت را ترکیب میکنند تا یک نتیجه واحد را برگردانند.
کار کردن با جداول و ستونها
جداول در Tabular Model ها مانند جداول اکسل بوده اما ازلحاظ فرمول و شیوه کار با دادهها باهم متفاوت هستند.
- فرمولها تنها با جداول و ستون کار میکنند، نه با سلولهای فردی، محدوده ها و یا آرایهها.
- فرمولها میتوانند از روابط برای دریافت مقادیر از جداول مرتبط استفاده کنند. مقادیری که بازیابی میشوند همیشه با مقدار سطر فعلی مرتبط است.
- نمیتوانید دادههای نامنظم، آنطور که در صفحه اکسل دارید، داشته باشید. هر سطر در یک جدول باید تعداد یکسانی ستون داشته باشد. با اینحال میتوانید مقادیر خالی در برخی از ستونها داشته باشید.
- ازآنجاکه یک نوع داده برای هر ستون تنظیمشده است، هر مقدار در آن ستون باید از همان نوع باشد.
ارجاع به جداول و ستون ها
با استفاده از نام جدول و ستون میتوان به آنها مراجعه کرد. بهعنوانمثال، فرمول زیر نشان میدهد که چگونه با استفاده از نام fully qualify به ستونهای دو جدول میتوان مراجعه کرد:
هنگامیکه یک فرمول ارزیابی میشود، طراح مدل ابتدا نوشتار کلی و سپس نام ستونها و جداول را که در برابر ستونها و جداول احتمالی در متن فعلی ارائه میدهد، بررسی میکند. اگر نام مبهم است یا اگر ستون یا جدول در دسترس نباشد، خطایی در فرمول خواهید داشت (یک رشته Error# بهجای مقدار داده در سلولهایی که خطا رخ میدهد).
روابط جدول
با ایجاد روابط بین جداول، توانایی جستجو در دادههای جدول دیگر و استفاده از مقادیر مرتبط را برای انجام محاسبات پیچیده میتوان بهدستآورد. برای مثال، میتوان از یک ستون محاسبهشده برای جستجوی همه سوابق حملونقل مربوط به نمایندگی فعلی استفاده کرد و سپس هزینه حملونقل هرکدام را محاسبه کرد. در بسیاری از موارد، ممکن است یک رابطه ضروری نباشد.
از تابع LOOKUPVALUE در یک فرمول میتوانیم استفاده کنیم تا مقدار را در result_columnName برای سطری که معیارهای مشخصشده در پارامترهای search_column و search_value را برآورده میکند، بازگرداند.
بسیاری از توابع DAX نیاز به ارتباط بین جداول یا جداول چندگانه را دارند تا ستونهایی را که به آنها اشاره شده پیدا کنید و نتایج منطقی را بازگرداند. سایر توابع تلاش خواهند کرد که رابطه را شناسایی کنند؛ بااینحال، برای کسب بهترین نتایج، همیشه باید رابطه را جایی که امکانپذیر است ایجاد کرد. مدل دادههای جدولی، روابط چندگانه را در میان جداول پشتیبانی میکند. برای جلوگیری از سردرگمی یا نتایج نادرست، فقط یک رابطه در یکزمان بهعنوان رابطه فعال تعیین میشود، اما میتوان رابطه فعال را بهصورت ضرورت برای تغییر اتصالات مختلف در دادهها در محاسبات تغییر داد. تابع USERELATIONSHIP میتواند برای تعیین یک یا چند رابطه که در یک محاسبه خاص استفاده میشود.
مشاهده قوانین طراحی این فرمولها هنگام استفاده از روابط مهم است:
- هنگامیکه جداول با یک رابطه متصل میشوند، باید مطمئن شوید که دو ستونی که بهعنوان کلید استفاده میشوند، مقادیری دارند که باهم سازگارند. یکپارچگی ارجاعی اجرا نمیشود، بنابراین ممکن است مقادیر ناسازگاری در یک ستون کلیدی و ایجاد یک رابطه وجود داشته باشد . اگر این اتفاق بیفتد، باید آگاه باشید که مقادیر خالی یا مقادیر ناسازگار ممکن است که بر نتایج فرمولها تأثیر بگذارد.
- هنگامیکه شما با استفاده از روابط، جداول را در مدل خود پیوند میدهید، محدوده(scope) یا context، همانجایی که فرمولها ارزیابی میشود، را بزرگ میکنید. تغییرات context که از اضافه کردن جداول جدید، روابط جدید و یا از تغییرات در روابط فعال حاصل میشود میتواند منجر به تغییراتی در نتایج شما شود به شیوهای که حتی پیشبینی نمیکنید.
پردازش و بروزرسانی
فرآیند و محاسبه دو عملیات جداگانه اما مرتبط است. شما باید این مفاهیم را هنگام طراحی یک مدل که شامل فرمولهای پیچیده، مقدار زیادی از دادهها یا دادههایی است که از منابع داده خارجی بهدستآمده، درک کنید. فرآیند (تازه کردن) بهروزرسانی دادهها در یک مدل با دادههای جدید از یک منبع داده خارجی است.
محاسبه مجدد فرایند بهروزرسانی نتایج فرمولها است تا منعکسکننده هر تغییری در فرمولها و تغییرات در دادههای اساسی باشد. محاسبه مجدد میتواند بر عملکرد شما تأثیر بگذارد:
- مقادیر یک ستون محاسبهشده، در مدل محاسبه و ذخیره میشود. برای بهروزرسانی مقادیر در ستون محاسبهشده، باید مدل را با استفاده از یکی از سه فرمان پردازش کنید – Process Full، Process Data یا Process Recalc. نتیجه این فرمول همیشه باید برای ستون کل مجدد محاسبه شود، هر بار که فرمول را تغییر دهید.
- مقادیر محاسبهشده توسط مژرها هرزمانی که یک کاربر مژر را به یک Pivot Table اضافه کرده یا یک گزارش باز کند؛ ارزیابی میشوند، زمانی که کاربر context را تغییر میدهد، مقادیر برگشت دادهشده توسط مژر تغییر میکند.
پردازش و تجدید محاسبه هیچ تأثیری بر فرمولهای فیلتر سطر ندارد، مگر اینکه نتیجهی یک محاسبه یک مقدار متفاوت را نشان دهد.
عیبیابی
اگر هنگام تعریف یک فرمول خطایی رخ دهد، ممکن است فرمول خطای دستوری، خطای معنایی یا خطای محاسبه داشته باشد.
حل خطاهای دستوری از همه راحتتر هستند. آنها معمولاً یک پرانتز یا کاما را از دست میدهند.
نوع دیگری از خطا زمانی اتفاق میافتد کهفرمول از لحاظ دستوری درست باشد، اما مقدار یا ستون اشارهشده در context فرمول معنی ندارد. چنین خطاهای معنایی و محاسباتی ممکن است ناشی از هرکدام از موارد زیر باشد:
- فرمول به یک ستون، جدول یا تابع ناموجود اشاره میکند.
- فرمول به نظر میرسد درست است، اما هنگامیکه موتور دادهها را دریافت میکند، یک نوع عدم سازگاری را پیدا میکند و خطایی را به وجود میآورد.
- فرمول یک شماره یا پارامتر نادرست را به یک تابع منتقل میکند.
- فرمول به یک ستون متفاوت که خطایی دارد اشاره میکند و بنابراین مقادیر آن نامعتبر است.
- این فرمول به ستونی اطلاق میشود که پردازش نشده است، به این معنی است که متادیتا دارد اما دادههای واقعی برای محاسبات استفاده نمیشود.
در چهار مورد اول، DAX تمام ستون را که حاوی فرمول نامعتبر است علامت میزند. در مورد آخر، DAX ستون را خاکستری میکند تا نشان دهد که ستون در وضعیت غیر پردازششده است.
درباره مبینا چزانی
دانش آموخته دانشگاه تهران، علاقهمند به کار در حوزه BI و شیفته یادگیری مطالب جدید هستم. و معتقدم هیچ گاه برای آموختن دیر نیست.
نوشته های بیشتر از مبینا چزانی
Tnx