در این قسمت میخواهیم بیشتر روی مفاهیم اعمال شرط بر روی خروجی عمل واکشی کار کنیم. برای شروع کوئری سادهی زیر را اجرا و خروجی آن را تفسیر میکنیم.
Select From [Adventure Works]
همان طور که مشاهده میکنید، خروجی یک عدد میباشد. بدون نام ستون یا ردیف؟!
بهخاطر بیاورید که هر Cube در SSAS دارای یک Measure پیش فرض بود که در صورت عدم اعلام نام یک Measure در کوئری، SSAS به صورت پیش فرض مقدار این Measure را بر میگرداند. خوب؛ نام ستون و سطر چرا ذکر نشده است؟
به دلیل عدم اعلام صریح نام سطر و ستون در کوئری بالا، SSAS نام ستون و سطر خاصی را نمیتواند نمایش دهد.
با بررسی کوئری زیر به درک بیشتری از شاخص (Measure) پیش فرض Cube دست پیدا خواهید کرد.
Select From [Adventure Works] Where ( [Measures].[Reseller Sales Amount] )
خروجی همچنان مانند بالا میباشد اما در این حالت اعلام شده است که از کدام شاخص باید واکشی انجام شود. دلیل خروجی مشابه، یکسان بودن شاخص پیش فرض و شرط اعلام شده میباشد. به بیان دیگر [Measures].[Reseller Sales Amount] در [Adventure Works] به عنوان شاخص پیش فرض معرفی شده است و با اجرای کوئری زیر عملا شرط واکشی برای یک شاخص متفاوت اعمال شده است.
Select From [Adventure Works] Where [Measures].[Internet Sales Amount]
کوئری زیر را اجرا کنید:
Select [Measures].[Internet Sales Amount] on columns From [Adventure Works]
تنها تفاوت دو کوئری بالا ، در آوردن نام ستون می باشد . زیرا در هر دو سرجمع ، یک شاخص واکشی می گردد .
کوئری زیر را اجرا کنید:
select [Measures].[Internet Sales Amount] on columns From [Adventure Works] Where [Measures].[Internet Sales Amount]
این کوئری با خطا مواجه می شود . زیرا در آن کوئری در یک Axis و در شرط ، اعمال انتخاب شاخص شده است که این مورد فقط می بایستی در یکی از این دو قسمت رخ دهد .
و همچنین در صورت انتخاب دو شاخص متفاوت نیز با خطا برخورد خواهیم کرد.
Select [Measures].[Internet Sales Amount] on columns From [Adventure Works] Where [Measures].[Reseller Sales Amount]
به عبارت دیگر نمیتوان در خواست فیلتر کردن کوئری را برروی شاخص 1 داد؛ در صورتیکه میخواهیم شاخص 2 را واکشی کنیم. اعمال شرط برای واکشی اطلاعات از شاخص، پیش فرض نوشتن این شرط لازم نمیباشد؛ زیرا این شاخص به صورت پیش فرض انتخاب شدهاست.
select { [Product].[Product Categories].[Category], [Product].[Product Categories] }on columns From [Adventure Works] Where [Measures].[Reseller Sales Amount]
بنابراین کوئری بالا و کوئری زیر یکسان عمل خواهند کرد:
select { [Product].[Product Categories].[Category], [Product].[Product Categories] }on columns From [Adventure Works]
حال میخواهیم سرجمع فروش نمایندگان فروش محصولات در کشور کانادا را بر اساس دسته بندی محصولات داشته باشیم . برای این منظور کوئری زیر را مینویسیم:
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where [Customer].[Customer Geography].[Country].[Canada]
با اعمال شرط کشور کانادا، عملا خروجی فروش نمایندگان فروش در کانادا بر اساس دسته بندی محصولات واکشی میگردد. کمی به خروجی دقت نمایید. مبلغ سرجمع برابر مبلغ کل فروش اینترنتی میباشد که در کوئریهای قبلی بدست آوردیم؟!
خروجی این کوئری مشکوک به نظر می رسد . زیرا سرجمع مبالغ فروش نمایندگان فروش برای کانادایی ها برابر کل فروش نمایندگان فروش می باشد .آیا کانادایی ها تمام خرید را انجام داده اند؟ خیر .
دلیل این اشکال در این است که هیچ گونه ارتباطی بین بعد مشتری و شاخص پیش فرض در سیستم وجود ندارد .
مشکل کوئری بالا در این کوئری با تغییر بعد در قسمت اعمال شرط برطرف شده؛ اکنون خروجی حقیقی مشاهده می شود .
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] }on columns From [Adventure Works] Where [Sales Territory].[Sales Territory].[Country].[Canada]
حال اگر بخواهیم دو شرط را به صورت همزمان داشته باشیم به صورت زیر عمل خواهیم کرد :
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where ( [Customer].[Customer Geography].[Country].[Canada], [Measures].[Internet Sales Amount] )
در کوئری بالا سرجمع فروش اینترنتی توسط مشتریان کانادایی بدست آمده است.
البته میتوان کوئری فوق را به صورت زیر هم نوشت و در این حالت نام ردیف هم در خروجی قابل مشاهده میباشد و البته دیگر نیازی به اعمال شرط، روی نام شاخص نمیباشد. زیرا اعمال شرط در ردیف انجام شده است.
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns, [Measures].[Internet Sales Amount] On rows From [Adventure Works] Where ( [Customer].[Customer Geography].[Country].[Canada] )
حال اگر بخواهیم فروش اینترنتی را برای استرالیا و کانادا داشته باشیم به صورت زیر عمل میکنیم .
Select { [Product].[Product Categories].[Category],[Product].[Product Categories] } on columns From [Adventure Works] Where ( [Customer].[Customer Geography].[Country].[Canada], [Customer].[Customer Geography].[Country].[Australia], [Measures].[Internet Sales Amount] )
در اینجا ما نیاز داریم میزان فروش اینترنتی کانادا و استرالیا را برای انواع محصولات بدست آوریم ، اما نحوه استفاده از دو ساختار سلسله مراتبی مرتبط با یک دایمنشن را درست رعایت نکردهایم .بنابر این کوئری زیر را اجرا خواهیم کرد :
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where ( { [Customer].[Customer Geography].[Country].[Canada], [Customer].[Customer Geography].[Country].[Australia] }, [Measures].[Internet Sales Amount] )
که همان کوئری بالا می باشد با این تفاوت که از {} استفاده شده است .
درابتدا میزان فروش نمایندگان فروش در انگلستان را بدست میآوریم:
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where [Sales Territory].[Sales Territory].[Country].[United Kingdom]
و برای بدست آوردن فروش اینترنتی تمام کشور ها به جز انگلستان بر اساس دسته بندی محصولات کوئری زیر را خواهیم نوشت :
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where [Sales Territory].[Sales Territory].[Country] - [Sales Territory].[Sales Territory].[Country].[United Kingdom]
البته از تابع Except هم میتوان به صورت زیر استفاده کرد
Select { [Product].[Product Categories].[Category], [Product].[Product Categories] } on columns From [Adventure Works] Where except( [Sales Territory].[Sales Territory].[Country], [Sales Territory].[Sales Territory].[Country].[United Kingdom] )
عملگر منها مشابه except کار میکند.