הבלוג של גרי רשף

22/12/2010

שימוש בפונקציות חלון בשאילתות Group By

Filed under: Uncategorized — תגיות: , — גרי רשף @ 22:00

פונקציות חלון מאפשרות לנו להוסיף לשליפה רגילה עמודה עם סיכומים מבלי לבצע Group By – פעולה שמקבצת נתונים ואינה מחזירה את ה-Set המקורי.

ניתן לשלב בין השתיים מבלי להזדקק לשאילתות משנה, אבל בזהירות מכיוון שפונקציות החלון פועלות על הסט המקובץ, ואנו עלולים לקבל תוצאות שונות ממה שתכננו..

בפוסט Calculate Percentage in SQL Server מציג שיטה לחישוב אחוזים בשאילתת Group By: ביצענו סיכום לפי ציונים, וכדי לדעת את חלקו של כל ציון בסה"כ יש לחלק את מספר הציונים בכל קבוצה בסה"כ הציונים; כלומר- לבצע פעם Count של Group By לפי קבוצה ופעם Count כללי כפונקציית חלון.

המחבר בחר לא להסתבך עם זה, או אולי לא שקל זאת או לא הצליח, ובכל מקרה- הנתונים לבעייה:

CREATE TABLE #ClassRoom(ID INT IDENTITY(1,1), Grade char(2) NULL);

GO


INSERT INTO #ClassRoom Values ('A');

INSERT INTO #ClassRoom Values ('B');

INSERT INTO #ClassRoom Values ('B+');

INSERT INTO #ClassRoom Values ('B');

INSERT INTO #ClassRoom Values ('A');

INSERT INTO #ClassRoom Values ('A+');

INSERT INTO #ClassRoom Values ('B');

INSERT INTO #ClassRoom Values ('B');

INSERT INTO #ClassRoom Values ('A+');

INSERT INTO #ClassRoom Values ('C');

GO

והפתרון בו המחבר בחר (בכמה שינויים קוסמטיים להפשטה):

Select Grade,

       100*Count(*)/tot 'Percent'

From   #ClassRoom,

       (Select Count(*) as tot

       From #ClassRoom) x

Group By Grade,

       tot;

ההצעה החלופית שלי המשלבת שימוש בפונקציות חלון:

Select Grade,

       (100*COUNT(*))/Sum(COUNT(*)) Over() 'Percent'

From   #ClassRoom

Group By Grade;

כלומר- מופעלת פונקציית החלון Sum על ה-Count של ה-Group By.

clip_image002

מבחינת ה-Execution Plan צפוי רווח מסויים בזכות העובדה שביצעתי Scan אחד ולא שניים:

clip_image004

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: