در زیر در ابتدا یک کوئری مینویسیم و سپس بررسی میکنیم که چگونه میتوان خروجی را مرتب کنیم.
Select [Measures].[Internet Sales Amount]on columns, [Product].[Product Categories].[Subcategory] on rows From [Adventure Works]
کوئری بالا میزان فروش اینترنتی را بر اساس دسته بندی محصولات واکشی میکند
در کوئری زیر لیست فروش، براساس میزان فروش اینترنتی مرتب شده است :
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Subcategory].[Subcategory], [Measures].[Internet Sales Amount] )on rows From [Adventure Works]
تابع Order، ستون یا ردیف خاصی را بر اساس ستون یا ردیف دیگری مرتب می کند .این تابع بر روی کل یک Axis اعمال میگردد و دو پارامتر دارد .
پارامتر دوم مشخص می کند مرتب سازی پارامتر اول بر اساس چه شاخصی باشد .
همچنین در کوئری زیر نحوهی مرتب کردن به صورت نزولی را خواهیم دید.
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Subcategory].[Subcategory], [Measures].[Internet Sales Amount], desc ) on rows From [Adventure Works]
مرتب سازی به صورت صعودی به شکل زیر میباشد
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Subcategory].[Subcategory], [Measures].[Internet Sales Amount], asc ) on rows From [Adventure Works]
از آنجایی که مرتب سازی به صورت پیش فرض صعودی می باشد، ب کار بردن این کلید واژه ، خیلی لازم نمی باشد .
رویکرد تابع Order با ساختار سلسله مراتبی
برای شروع کوئری زیر را اجرا میکنیم.
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Internet Sales Amount], asc ) on rows From [Adventure Works]
البته در این حالت با نگاه کردن به خروجی متوجه میشوید که عملیات مرتب سازی به درستی انجام نشده است و دلیل این اتفاق رویکرد تابع مرتب سازی به ساختار سلسله مراتبی میباشد . عملا تابع مرتب سازی احترام ویژه ای به ساختار سلسله می گزارد .
حال همان کوئری را به صورت زیر اجرا میکنیم :
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Internet Sales Amount], basc ) on rows From [Adventure Works]
حرف b در کلمه ی کلیدی basc به معنی شکستن ساختار سلسله مراتبی می باشد . در این حالت عملیات مرتب سازی بدون درنظر گرفتن ساختار سلسله مراتبی انجام می گردد .
کوئریهای زیر تاثیر مرتب سازی نزولی و ساختار سلسله مراتبی را بررسی میکنند
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Internet Sales Amount], desc ) on rows From [Adventure Works]
در این حالت مرتب سازی نزولی انجام می گردد اما با درنظر گرفتن ساختار سلسله مراتبی
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Internet Sales Amount], bdesc ) on rows From [Adventure Works]
در این حالت عمل مرتب سازی نزولی بدون درنظر گرفتن ساختار سلسله مراتبی انجام میگردد .
می توان مرتب سازی را بر اساس یک ستون که در کوئری ذکر نشده است انجام داد . در این حالت نتیجه در ظاهر مرتب نمی باشد .
Select [Measures].[Internet Sales Amount] on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Reseller Sales Amount], bdesc ) on rows From [Adventure Works]
در این کوئری دو ستون وجود دارد اما مرتب سازی براساس یکی از ستون ها انجام می شود
Select { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on columns, order( [Product].[Product Categories].[Subcategory], [Measures].[Reseller Sales Amount], bdesc ) on rows From [Adventure Works]
عملیات مرتب سازی می تواند بر روی هرکدام از Axis ها جداگانه انجام گردد .
Select order( [Product].[Product Categories].[Subcategory], [Measures].[Reseller Sales Amount], bdesc ) on columns, { [Measures].[Internet Sales Amount], [Measures].[Reseller Sales Amount] } on rows From [Adventure Works]
از تابع hierarchize هم میتوان برای عملیات مرتب سازی استفاده کرد
Select [Measures].[Internet Sales Amount] on columns, hierarchize( { [Product].[Subcategory].[Touring Bikes], [Product].[Subcategory], [Product].[Subcategory].[Mountain Bikes] } )on rows From [Adventure Works]
برای مرتب سازی ردیف هایی که عملا ارتباطی با هم ندارند از این تابع استفاده می شود . پیش فرض مرتب سازی نزولی می باشد . البته می توانستیم همچنان از تابع Order استفاده کنیم:
Select [Measures].[Internet Sales Amount] on columns, Order( { [Product].[Subcategory].[Touring Bikes], [Product].[Subcategory], [Product].[Subcategory].[Mountain Bikes] } , [Measures].[Internet Sales Amount] , basc )on rows From [Adventure Works]
حال میخواهیم ببینیم چگونه میتوان با استفاده از تابع hierarchize مرتب سازی صعودی را انجام دهیم :
Select [Measures].[Internet Sales Amount] on columns, hierarchize( { [Product].[Subcategory].[Touring Bikes], [Product].[Subcategory], [Product].[Subcategory].[Mountain Bikes] }, post ) on rows From [Adventure Works]
همان طور که مشخص میباشد مرتب سازی به درستی صورت نگرفته است؟! دلیل این اتفاق اولویت دادن به ساختار سلسله مراتبی میباشد.
برای بررسی بیشتر ابتدا کوئری زیر را فراخوانی نمایید :
Select [Measures].[Internet Sales Amount] on columns, non empty order( crossjoin( [Product].[Category].[Category], [Product].[Subcategory].[Subcategory] ), [Measures].[Internet Sales Amount], desc ) on rows From [Adventure Works]
همانطور که مشخص میباشد، مرتب سازی براساس فروش اینترنتی و با درنظر گرفتن ساختار سلسله مراتبی صورت گرفته است. برای مرتب سازی بدون در نظر گرفتن ساختار سلسله مراتبی کوئری زیر را بنویسید :
Select [Measures].[Internet Sales Amount] on columns, non empty order( crossjoin( [Product].[Category].[Category], [Product].[Subcategory].[Subcategory] ), [Measures].[Internet Sales Amount], bdesc ) on rows From [Adventure Works]
در این حالت مرتب سازی بدون در نظر گرفتن ساختار سلسله مراتب انجام می گردد .
در دو کوئری فوق از تابع Non empty برای حذف ردیفهای Null استفاده شده است.