בעקבות בלבול קטן , החלטתי לכתוב על ההבדל בין 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
אם נבקש את אותו דבר לשנת 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]
נקבל
עד כאן אין חדש אך מכיוון שאנו לא נרצה שהמשתמשים יכתבו לכל דוח שהם בונים שאילתות MDX וגם אנחנו נרצה לעשות לנו חיים קלים ולעשות שימוש בקוד שכבר כתבנו
במספר דוחות נכתוב את ה set הבא ונשתמש בו:
CREATE SET CURRENTCUBE.[NegativeMarginProducts] AS Filter([Product].[Subcategory].[Subcategory], ( [Measures].[Sales Amount]- [Measures].[Total Product Cost]) / [Measures].[Sales Amount]<0) ;
באקסל , המשתמש פשוט בוחר ב set המתאים ומתקבלת התוצאה:
השאילתה שהתקבלה בקובייה היא:
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 ונקבל את התוצאה השגויה:
הסיבה היא שה 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 ונראה שהתוצאה מסתדרת כי היא חושבה בזמן ריצה:
שימו לב שאני התמקדתי ב sets גלובלים שמשתמשים בפקודה create set והם סטטים, יש סוגי sets אחרים כגון named sets הנוצרים ע"י with set
נייצר אותם לטובת הרצה של שאילתה בודדת (http://msdn.microsoft.com/en-us/library/ms145487.aspx )
או CREATE SESSION SET שקיים ל session שלם