» נושאי לימוד
» נושאי לימוד
יום חמישי 25 באפריל 2024
הגבלת GROUP BY
דף ראשי  מילון מונחים  פונקציות ואופרטורים  פונקציות והגבלות לשימוש עם משפטי GROUP BY  הגבלת GROUP BY גרסה להדפסה

המשפט GROUP BY מאפשר את השמוש בהגבלה WITH ROLLUP שגורמת לכך שיתווספו שורות נוספות לתוצאת הסיכום. שורות אלו מייצגים פעולות HIGH LEVEL של סכום. לכן ROLLUP מאפשר לנו לענות על שאלות במספר רמות של ניתוח בשאילתא בודדת. ניתן להשתמש בו, לדוגמא, בשביל לספק תמיכה לפעולות ניתוח נתונים מקוון (OLAP).

בשביל ההמחשה, נניח שלטבלה בעלת השם sales יש את העמודות: year,country,product ו-profit שנועדה לרשום את רווחיות המכירות:

 

 

CREATE TABLE sales

(

    year    INT NOT NULL,

    country VARCHAR(20) NOT NULL,

    product VARCHAR(32) NOT NULL,

    profit  INT

);

 

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

 

 

;mysql> SELECT year, SUM(profit) FROM sales GROUP BY year

 
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
+------+-------------+

 

הפלט מראה את הרווח הכללי לכל שנה, אבל אם אנו רוצים גם לקבוע את הרווח הכללי לכל השנים, אנו חייבים לחבר את הערכים הבודדים לבד ולהריץ שאילתא נוספת. או שאנו יכולים להשתמש ב-ROLLUP, שמספקת את שתי הרמות של הניתוח באמצעות שאילתא בודדת. הוספת WITH ROLLUP ל-GROUP BY תגרום לשאילתא לייצור שורה נוספת שמראה את הערכים של הסכום הכולל של כל השנים:

 

 

mysql> SELECT year, SUM(profit)

FROM sales GROUP BY year WITH ROLLUP;

 
+------+-------------+
| year | SUM(profit) |
+------+-------------+
| 2000 |        4525 |
| 2001 |        3010 |
| NULL |        7535 |
+------+-------------+

 

השורה שצוברת את הסכום הכולל מזוהה עם הערך NULL בטור של year.

ל-ROLLUP יש השפעה הרבה יותר מורכבת כאשר יש מספר רב של טורי GROUP BY. במקרה זה, כל זמן שיש איזה שהוא "break" (שינוי בערך) חוץ מטור ה-grouping האחרון, השאילתא מייצרת שורה של צובר כללי נוסף. לדוגמא, ללא ROLLUP, פעולת סכום על טבלת ה-sales שמבוססת על year,country ו-product יכולה להיראות כך:

 

 

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product;

 

+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2001 | Finland | Phone      |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
+------+---------+------------+-------------+

 

הפלט מראה את ערכי הסכום רק ברמת הניתוח של year/country/product. כאשר נוסיף את ROLLUP, השאילתא תייצר שורות נוספות:

 

 

mysql> SELECT year, country, product, SUM(profit)

    -> FROM sales

    -> GROUP BY year, country, product WITH ROLLUP;

 
+------+---------+------------+-------------+
| year | country | product    | SUM(profit) |
+------+---------+------------+-------------+
| 2000 | Finland | Computer   |        1500 |
| 2000 | Finland | Phone      |         100 |
| 2000 | Finland | NULL       |        1600 |
| 2000 | India   | Calculator |         150 |
| 2000 | India   | Computer   |        1200 |
| 2000 | India   | NULL       |        1350 |
| 2000 | USA     | Calculator |          75 |
| 2000 | USA     | Computer   |        1500 |
| 2000 | USA     | NULL       |        1575 |
| 2000 | NULL    | NULL       |        4525 |
| 2001 | Finland | Phone      |          10 |
| 2001 | Finland | NULL       |          10 |
| 2001 | USA     | Calculator |          50 |
| 2001 | USA     | Computer   |        2700 |
| 2001 | USA     | TV         |         250 |
| 2001 | USA     | NULL       |        3000 |
| 2001 | NULL    | NULL       |        3010 |
| NULL | NULL    | NULL       |        7535 |
+------+---------+------------+-------------+

 

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

 

×      לאחר כל מערך של שורות מוצרים לשנה מסוימת ולמדינה מסוימת, מתווספת שורה נוספת של סכום שמחווה על הסכום של כל המוצרים. בשורות אלו, עמודת ה-product מסתיימת ב-NULL.

 

×      לאחר כל מערך של שורות לשנה מסוימת, מתווספת שורה נוספת של סכום שמחווה על הסכום בכל המדינות והמוצרים. בשורות אלו, עמודות country ו-products מסתיימות ב-NULL.

 

×      לבסוף, לאחר כל שאר השורות, מתווספת שורה נוספת של סכום שמחווה על הסכום הכולל של השנים, המוצרים והמוצרים. בשורה זו, עמודות year,country ו-products מסתיימות ב-NULL.

 

 

 04-04-04 / 15:25  עודכן ,  17-03-04 / 13:59  נוצר ע"י אלי אלוני בתאריך 
 פונקציות GROUP BY - הקודםהבא - שימוש ב-GROUP BY עם שדות מוסתרים 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 4