در این قسمت بر روی تابع Filter در MDX Query ها تمرکز خواهیم کرد. برای آشنایی با این تابع یک سری از کوئریها را اجرا کرده و به بررسی آنها میپردازیم.
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, [Product].[Product Categories].[Category] on rows From [Adventure Works]
دقت کنید که در واکشی، مقدار فروش اینترنتی Component برابر Null میباشد.
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Measures].[Internet Sales Amount] > 0 ) on rows From [Adventure Works]
با توجه به شرطی که اعمال شده است، فقط دسته بندی محصولاتی در خروجی می آید که فروش اینترنتی آنها بیشتر از صفر یا برابر Null نباشند.
استفاده از کلید واژه ی Having در هر محور کاری شبیه به انجام عمل فیلترینگ می باشد .
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, [Product].[Product Categories].[Category] having [Measures].[Internet Sales Amount] > 0 on rows From [Adventure Works]
اگر بخواهیم میزان فروش اینترنتی و میزان فروش نمایندگان فروش را برای محصولاتی واکشی کنیم که میزان فروش اینترنتی آنها بیش از 500000 دلار میباشد ، کوئری زیر را خواهیم داشت :
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Measures].[Internet Sales Amount] > 500000 ) on rows From [Adventure Works]
و برای ایجاد شرط ترکیبی بر روی شاخص، به صورت زیر عمل خواهیم کرد :
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Measures].[Internet Sales Amount] > 500000 and [Measures].[Internet Sales Amount] < 750000 ) on rows From [Adventure Works]
در مثال بالا، دسته بندی محصولاتی در خروجی واکشی شده اند که میزان فروش اینترنتی آنها بیش از 500 هزار و کمتر از 750 هزار میباشد.
استفاده از And , Or در شروط ترکیبی مجاز میباشد
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Measures].[Internet Sales Amount] > 750000 or [Measures].[Internet Sales Amount] < 500000 ) on rows From [Adventure Works]
در زیر با استفاده از And، شرط برروی میزان فروش نمایندگان فروش نیز قرارداده شده است.
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], ( [Measures].[Internet Sales Amount] > 750000 or [Measures].[Internet Sales Amount] < 500000 ) and [Measures].[Reseller Sales Amount] < 15000000 ) on rows From [Adventure Works]
در هنگام ایجاد شروط ترکیبی حتما از () استفاده کنید .
حال میخواهیم دو شاخص در یک ردیف، با یکدیگر مقایسه شوند و در صورت صحت شرط، آن ردیف در خروجی قرار گیرد
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Measures].[Internet Sales Amount] > [Measures].[Reseller Sales Amount] ) on rows From [Adventure Works]
ایجاد فیلترینگ با استفاده از currentmember و عملگر Is .
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Bikes] ) on rows From [Adventure Works]
البته در مثال بالا می توانیم به جای استفاده از Is از = استفاده کنیم. تا اینجا عمل Filtering برروی شاخصها انجام شده است. اما امکان اعمال Filter روی Dimension ها نیز وجود دارد.
کوئری زیر را بررسی کنید :
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Bikes] or [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Accessories] ) on rows From [Adventure Works]
در کوئری بالا میزان فروش نمایندگان فروش و فروش اینترنتی برای دسته بندیهای Bike و Accessories واکشی شده است.
امکان ایجاد شرایط ترکیبی از شاخصها و بعدها در یک Filter نیز وجود دارد.
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], ( [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Bikes] and [Measures].[Reseller Sales Amount] > 1000000 ) or ( [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Accessories] ) and [Measures].[Reseller Sales Amount] > 750000 )on rows From [Adventure Works]
همچنین میتوان از Not درون شرط Filter استفاده کرد
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, filter( [Product].[Product Categories].[Category], not ( [Product].[Product Categories].currentmember is [Product].[Product Categories].[Category].[Clothing] ) ) on rows From [Adventure Works]
در زیر میخواهیم به بررسی تابع non Empty بپردازیم . برای این منظور در ابتدا کوئری زیر را اجرا کنید :
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, [Product].[Product Categories].[Subcategory] on rows From [Adventure Works]
با استفاده از تابع Non Empty، ردیف ها یا ستون هایی حذف می گردند که تمامی مقادیر آنها ، در آن ردیف یا در آن ستون برابر Null باشند.
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, non empty [Product].[Product Categories].[Subcategory] on rows From [Adventure Works]