در این قسمت بر روی توابع Topcount, bottomcount , toppercent, bottompercent, topsum, bottomsum تمرکز خواهیم داشت.
در ابتدا تصور کنید بخواهیم میزان فروش اینترنتی را برای پنج ردیف از دسته بندیهای محصولات واکشی کنیم.
Select [Measures].[Internet Sales Amount] on columns, non empty( topcount([Product].[Product Categories].[Subcategory],5) ) on rows From [Adventure Works]
در تابع بالا پنج ردیف ابتدایی (به صورت فیزیکی) برگردانده میشوند.
در اینجا تابع topcount دارای دو پارامتر می باشد که پارامتر دوم آن مشخص کنندهی تعداد ردیف واکشی شده و پارامتر اول آن، مشخص کنندهی دایمنشنی میباشد که عمل واکشی برای آن صورت میگیرد. همچنین در بالا از تابع Non empty برای حذف ردیفهای دارای مقدار Null استفاده شده است. حال تصور کنید بخواهیم پنج دسته بندی محصولی را دریافت کنیم که دارای بیشترین میزان فروش اینترنتی میباشند.
Select [Measures].[Internet Sales Amount] on columns, non empty( topcount( [Product].[Product Categories].[Subcategory], 5, [Measures].[Internet Sales Amount] ) ) on rows From [Adventure Works]
خروجی بر اساس میزان فروش اینترنتی به صورت نزولی مرتب شده است.
تابع Topcount به عنوان پارامتر سوم میتواند نام یک Measure را دریافت کند و خروجی را براساس آن شاخص، برگرداند. امکان واکشی و مرتب سازی در تابع Topcount
برای یک شاخص متفاوت از شاخص واکشی شده در یک محور دیگر نیز وجود دارد به مثال زیر دقت کنید:
Select [Measures].[Internet Sales Amount] on columns, topcount( [Product].[Product Categories].[Subcategory], 5, [Measures].[Reseller Sales Amount] ) on rows From [Adventure Works]
همانطور که مشخص میباشد، پنج دسته بندی محصولاتی که دارای بیشترین میزان فروش نمایندگان فروش میباشند، در خروجی واکشی شدهاند؛ در حالیکه در محور ستون میزان فروش اینترنتی واکشی شده است.
برای درک بیشتر همین کوئری را دوباره بازنویسی کرده اما اینبار در محور ستون هر دو شاخص [Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount] را واکشی میکنیم.
Select {[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} on columns, topcount( [Product].[Product Categories].[Subcategory], 5, [Measures].[Reseller Sales Amount] ) on rows From [Adventure Works]
با بررسی خروجی دو کوئری بالا تفاوت واکشی را متوجه خواهید شد. در هر دو کوئری واکشی براساس شاخص [Measures].[Reseller Sales Amount] انجام شده است
اما واکشی در محور ستون متفاوت میباشد. (دقیقا مانند T/SQL که میتوانستیم، مرتب سازی براساس فیلدی باشد که در قسمت Projection حاضر نبوده و در این حالت در برخی موارد ظاهرا خروجی مرتب نمیباشد)
حال تصور کنید بخواهیم 30 دسته بندی محصولاتی را داشته باشیم که دارای کمترین میزان فروش اینترنتی میباشند. برای این منظور از تابع bottomcount استفاده میکنیم
Select [Measures].[Internet Sales Amount] on columns, bottomcount( [Product].[Product Categories].[Subcategory], 30, [Measures].[Internet Sales Amount] ) on rows From [Adventure Works]
ردیف هایی که دارای مقدار Null می باشند هم در خروجی قرار می گیرند
Select [Measures].[Internet Sales Amount] on columns, non empty bottomcount( [Product].[Product Categories].[Subcategory], 30, [Measures].[Internet Sales Amount] )on rows From [Adventure Works]
در مثال بالا ردیفهای دارای مقدار Null را از خروجی حذف کرده ایم.
گاهی نیاز میباشد که تعداد دسته بندیهای محصولاتی را واکشی کنیم که دارای بیشترین یا کمترین میزان فروش اینترنتی میباشند و سرجمع فروش اینترنتی آنها بیشتر یا کمتر از X درصد از فروش اینترنتی کل میباشد را داشته باشند. به عنوان مثال میخواهیم ببینیم کدام دسته بندی محصولات شامل بیشترین میزان فروش اینترنتی میباشند و سرجمع فروش آنها 53 در صد از کل فروش اینترنتی میباشند.
Select [Measures].[Internet Sales Amount] on columns, { toppercent( [Product].[Product Categories].[Subcategory], 53, [Measures].[Internet Sales Amount] ), [Product].[Product Categories] } on rows From [Adventure Works]
و یا واکشی دسته محصولاتی که دارای کمترین میزان فروش اینترنتی میباشند و سرجمع فروش اینترنتی آنها کمتر از 1 درصد کل میزان فروش اینترنتی میباشد.
Select [Measures].[Internet Sales Amount] on columns, non empty bottompercent( [Product].[Product Categories].[Subcategory], --0.01, 1, [Measures].[Internet Sales Amount] ) on rows From [Adventure Works]
کاربرد تابع Topsum در کوئری زیر نمایش داده شده است
Select [Measures].[Internet Sales Amount] on columns, topsum( [Product].[Product Categories].[Subcategory], 25000000, [Measures].[Internet Sales Amount] ) on rows From [Adventure Works]
در این کوئری از تابع TopSum استفاده شده است که عملا حداکثر تعداد دسته بندی محصولاتی را بازیابی میکند که دارای بیشترین میزان فروش بوده اند و همچنین در مجموع بیش از 25000000 فروش داشته باشند .
تابع bottomsum عملا تعداد دسته بندی محصولاتی را که دارای کمترین میزان فروش بوده اند و همچنین سرجمع میزان فروش اینترنتی آنها 100000 بوده است را بر می گرداند. البته خروجی توسط non empty ، فیلتر شده است و خروجی هایی که کاملا Null می باشند، حذف گردیده اند.
Select [Measures].[Internet Sales Amount] on columns, non empty bottomsum( [Product].[Product Categories].[Subcategory], 100000, [Measures].[Internet Sales Amount] )on rows From [Adventure Works]