آموزش MDX Query - قسمت هفتم – استفاده از Pivot ، به کارگیری از ساختار های سلسله مراتبی و به کارگیری Cross Join در کوئری ها
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: چهار دقیقه

انجام عملیات Pivot توسط MDX :

برای این منظور کافی است فقط جای سطر و ستون را با هم عوض کنیم.برای مثال، کوئری‌های زیر را اجرا نمایید.

Select
[Date].[Calendar].[Calendar Year] on columns,
[Product].[Product Categories].[Category] on rows
From [Adventure Works]

GO

Select
[Product].[Product Categories].[Category] on columns,
[Date].[Calendar].[Calendar Year] on rows
From [Adventure Works]

خروجی به صورت زیر می‌باشد.

چگونگی استفاده از ساختار‌های سلسله مراتبی در محور‌های مختلف :

برای روشن شدن مطلب چندین نمونه کوئری زیر را باهم اجرا می‌کنیم.

در ابتدا به خاطر داشته باشید که امکان استفاده از یک ساختار سلسله مراتبی در دو محور (Axis ) مجزا وجود ندارد. برای روشن‌تر شدن این مطلب کوئری زیر را اجرا کنید:

Select
[Date].[Calendar].[Calendar Year] on columns,
[Date].[Calendar].[Month] on rows
From [Adventure Works]

در توضیح مثال بالا دقت داشته باشید که واکشی [Calendar Year] و [Month] از یک ساختار سلسله مراتبی یکسان به نام [Date].[Calendar] انجام شده است و این کار در MDX ‌ها غیر مجاز می‌باشد.

البته استفاده از دو ساختار سلسله مراتبی متفاوت از یک دایمنشن در دو محور مجزا امکان پذیر می‌باشد برای مثال :

Select
[Date].[Calendar].[Calendar Year] on columns,
[Date].[Month of Year].[Month of Year] on rows
From [Adventure Works]

در مثال بالا واکشی از دو ساختار سلسله مراتبی مختلف اما از یک دایمنشن در دو محور مجزا صورت گرفته است.

امکان استفاده از دو ساختار سلسله مراتبی یکسان در یک محور مجاز می‌باشد.

Select
[Measures].[Internet Sales Amount] on columns,
{[Date].[Calendar].[Calendar Year],[Date].[Calendar].[Month]} on rows
From [Adventure Works]

همچنین استفاده از دو ساختار سلسله مراتبی مختلف از یک دایمنشن در یک محور مجاز نمی‌باشد.

Select
[Measures].[Internet Sales Amount] on columns,
{[Date].[Calendar].[Calendar Year],[Date].[Month of Year].[Month of Year]} on rows
From [Adventure Works]

در مثال بالا از دو ساختار سلسله مراتبی [Date].[Calendar] و   [Date].[Month of Year] استفاده شده است.

در صورتی می‌توانیم از دو ساختار سلسله مراتبی متفاوت از یک دایمنشن در یک محور استفاده کنیم که آنها را باهم Cross Join  کنیم.

Select
[Measures].[Internet Sales Amount]on columns,
crossjoin(
[Date].[Calendar].[Calendar Year],
[Date].[Month of Year].[Month of Year]
)on rows
From [Adventure Works]

دقت داشته باشید که امکان استفاده از دو ساختار سلسله مراتبی یکسان از یک دایمنشن در Cross Join وجود ندارد همان گونه که در دو مثال قبل مشاهده نمودید. (و البته نیازی هم به استفاده از Cross Join  وجود ندارد)

Select
[Measures].[Internet Sales Amount] on columns,
crossjoin(
[Date].[Calendar].[Calendar Year],
[Date].[Calendar].[Month]
)on rows
From [Adventure Works]

به طور کلی استفاده از Cross Join مانند استفاده از () می باشد . بنابر این می توان کلمه ی Cross Join را ننوشت .

Select
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} on columns,
crossjoin(
[Date].[Calendar].[Calendar Year],
[Date].[Month of Year].[Month of Year]
)on rows
From [Adventure Works]
GO
Select
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]} on columns,
(
  [Date].[Calendar].[Calendar Year],
  [Date].[Month of Year].[Month of Year]
)on rows
From [Adventure Works]

دو کوئری بالا مشابه هم می‌باشند.

می توان از دو Cross Join در دو محور مختلف نیز استفاده کرد.

Select
crossjoin(
[Product].[Product Categories].[Category],
{[Measures].[Internet Sales Amount],[Measures].[Reseller Sales Amount]}
)on columns,
crossjoin(
[Date].[Calendar].[Calendar Year],
[Date].[Month of Year].[Month of Year]
)on rows
From [Adventure Works]

دقت داشته باشید نوع محصول در ستون‌ها بالای سر ستون [ Internet Sales Amount] و   [Reseller Sales Amount] قرار گرفته است.

استفاده از Cross Join  های تودر تو نیز وجود دارد.

Select
crossjoin(
[Sales Territory].[Sales Territory].[Country],
crossjoin(
[Product].[Product Categories].[Category],
{
[Measures].[Internet Order Count],
[Measures].[Reseller Order Count]
}
  )
)on columns ,
crossjoin(
[Date].[Calendar].[Calendar Year],
[Date].[Month of Year].[Month of Year]
) on rows
From [Adventure Works]

در کوئری زیر به جای Cross Join  از () استفاده شده است

Select
crossjoin(
[Sales Territory].[Sales Territory].[Country],
[Product].[Product Categories].[Category],
{
[Measures].[Internet Order Count],
[Measures].[Reseller Order Count]
}
 ) on columns,
([Date].[Calendar].[Calendar Year],[Date].[Month of Year].[Month of Year]) on rows
From [Adventure Works]

استفاده از عملگر * مانند استفاده از Cross Join  می باشد.

Select
crossjoin(
[Sales Territory].[Sales Territory].[Country],
[Product].[Product Categories].[Category],
{
[Measures].[Internet Order Count],
[Measures].[Reseller Order Count]
}
) on columns,
[Date].[Calendar].[Calendar Year] * [Date].[Month of Year].[Month of Year] on rows
From [Adventure Works]

در مقالات بعدی آموزش MDX Query را ادامه خواهیم داد.