הצטרפו לקבוצות שלנו לקבלת עדכונים מרוכזים פעם בשבוע:

ווטסאפ:
http://wa.dwh.co.il
טלגרם:
http://telegram.dwh.co.il

מאת:אלדד הרץ
בעקבות בלבול קטן , החלטתי לכתוב על ההבדל בין sets ו dynamic sets.
קודם נכתוב כמה שאילתות רגילות, אח"כ נראה איך כותבים את אותם שאילתות בשימוש ב sets  נראה את הבעייתיות ולבסוף נראה כיצד ה dynamic sets מסדרים לנו את הבעיה.

השאילתה הבאה מחשבת את ה מוצרים ברמת Subcategory להם יש רווח גולמי שולי שלילי.

with member NegativeMarginProducts as ( [Measures].[Sales Amount]- [Measures].[Total Product Cost]) / [Measures].[Sales Amount] ,FORMAT_STRING = 'Percent' SELECT NegativeMarginProducts ON 0 , NON EMPTY [Product].[Subcategory].[Subcategory] HAVING NegativeMarginProducts < 0 ON 1 FROM [Adventure Works  

image004

 

 

 

אם נבקש את אותו דבר לשנת 2004

with member NegativeMarginProducts as ( [Measures].[Sales Amount]- [Measures].[Total Product Cost]) / [Measures].[Sales Amount] ,FORMAT_STRING = 'Percent' SELECT NegativeMarginProducts ON 0 , NON EMPTY [Product].[Subcategory].[Subcategory] HAVING NegativeMarginProducts < 0ON 1 FROM [Adventure Works]WHERE [Date].[Calendar Year].&[2001]

נקבל

 

image006

 

 

 

עד כאן אין חדש אך מכיוון שאנו לא נרצה שהמשתמשים יכתבו לכל דוח שהם בונים שאילתות MDX וגם אנחנו נרצה לעשות לנו חיים קלים ולעשות שימוש בקוד שכבר כתבנו
במספר דוחות נכתוב את ה set  הבא ונשתמש בו:

CREATE SET CURRENTCUBE.[NegativeMarginProducts] AS Filter([Product].[Subcategory].[Subcategory], ( [Measures].[Sales Amount]- [Measures].[Total Product Cost]) / [Measures].[Sales Amount]<0) ;

באקסל , המשתמש פשוט בוחר ב set המתאים ומתקבלת התוצאה: 

 

image002 

השאילתה שהתקבלה בקובייה היא:
SELECT [Measures].[Gross Profit Margin] ON 0, NegativeMarginProducts ON 1 FROM [Adventure Works]

עכשיו נחתוך על 2001:
SELECT [Measures].[Gross Profit Margin] ON 0, NegativeMarginProducts ON 1 FROM [Adventure Works]WHERE [Date].[Calendar Year].&[2001 ונקבל את  התוצאה השגויה:

image007

 

 

 

הסיבה היא שה set  חושב פעם אחת כנגד [Date].[All Periods] בקובייה ולכן הערך שלו נשאר קבוע ללא קשר למה שאנחנו נעשה.
 
נפתח שוב את ה SSAS 2008, מה לא אמרתי ש dynamic sets נתמכים מ ssas 2008 ?
ונשנה את ה SET להיות דינאמי באופן הבא:

CREATE DYNAMIC SET CURRENTCUBE.[NegativeMarginProducts] AS Filter([Product].[Subcategory].[Subcategory], ( ([Measures].[Sales Amount]- [Measures].[Total Product Cost]) / [Measures].[Sales Amount])<0) ;  

נבצע deploy ונראה שהתוצאה מסתדרת כי היא חושבה בזמן ריצה:

image003

 

 

 

 

 

 

שימו לב שאני התמקדתי ב sets גלובלים שמשתמשים בפקודה create set והם סטטים, יש סוגי sets אחרים כגון named sets הנוצרים ע"י with set
נייצר אותם לטובת הרצה של שאילתה בודדת (http://msdn.microsoft.com/en-us/library/ms145487.aspx )
או CREATE SESSION SET שקיים ל session שלם

 (http://msdn.microsoft.com/en-us/library/ms145976.aspx)