Sum על חלק מהתוצאות - SQL
-
אני רוצה לעשות בשאילתה אחת sum על כמה שדות. אבל שבאחת השדות הוא יסנן אחרת מאשר השדה השניה.
נניח יש לי טבלה של אימוני ספורט. יש שדה של זמן האימון ושדה של עלות האימון.
איך אפשר בשאילתה אחת לעשות SUM על כל הזמן, ו SUM רק העלות של ימי ראשון?העניין הוא לחסוך בזמן השאילתה, כי במקום שיחפש פעמיים את הנתונים, הוא יחפש רק פעם אחת.
-
אני רוצה לעשות בשאילתה אחת sum על כמה שדות. אבל שבאחת השדות הוא יסנן אחרת מאשר השדה השניה.
נניח יש לי טבלה של אימוני ספורט. יש שדה של זמן האימון ושדה של עלות האימון.
איך אפשר בשאילתה אחת לעשות SUM על כל הזמן, ו SUM רק העלות של ימי ראשון?העניין הוא לחסוך בזמן השאילתה, כי במקום שיחפש פעמיים את הנתונים, הוא יחפש רק פעם אחת.
@מנצפך לעשות IF על העמודה השנייה
לדוגמא,IF(day=1,price,0)
כאשר אתה בודק אם התנאי מתאים למה שאתה רוצה, ואם כן אתה מעביר את הסכום, אחרת, אתה מחזיר אפס.
על השדה הזה אתה עושה SUM.שים לב, לגבי הIF, זה תלוי מה המסד שלך.
באקסס זה IIF, בSQL ובMYSQL זה IF
https://www.w3schools.com/sql/func_mysql_if.asp -
@מנצפך לעשות IF על העמודה השנייה
לדוגמא,IF(day=1,price,0)
כאשר אתה בודק אם התנאי מתאים למה שאתה רוצה, ואם כן אתה מעביר את הסכום, אחרת, אתה מחזיר אפס.
על השדה הזה אתה עושה SUM.שים לב, לגבי הIF, זה תלוי מה המסד שלך.
באקסס זה IIF, בSQL ובMYSQL זה IF
https://www.w3schools.com/sql/func_mysql_if.asp -
@מנצפך אז ברור שלכאורה הוא לא הכי יעיל בכמויות
אולי תעשה עוד שאילתה (תצוגה) שמורה, ותחבר בינהם בJOIN -
@clickone למה זה ברור שזה לא יעיל בכמויות?
הרי זה רק תנאי נוסף באותו לולאה
זה לא לולאה חדש@upsilon01 כי אתה עושה עליו SUM.
ז"א, קודם אתה אוסף את הנתונים, לפני הSUM.
עושה את הIF על כל הנתונים, גם על מה שלא נכלל בתנאי (ימים שהם לא יום ראשון בדוגמא שהוא הביא)
ובסוף אתה עושה את הSUM על הערכים שחזרו.
בקצת רשומות ובקשות זה בכלל לא משמעותי. אבל אם יש הרבה בקשות והרבה רשומות אני חשוב שזה טיפה יקר מבחינת ביצועים (לא בדקתי)
השיטה השנייה שהצעתי, לעשות תצוגה שמורה, יותר יעילה עקרונית, כי קודם נעשה WHERE על הרשומות, ומגיעים רק הרשומות הרלוונטיות, ועליהם נעשה הSUM, ורק אח"כ מחברים אותה לתצוגה הראשית עם JOIN (אפשר כמובן גם עם שאילתת משנה.)לא בדקתי את מה שאני כותב לעומק.
רק תחושת בטן וטיפה מנסיון שזה "נראה" רץ יותר יעיל וזריז. -
@upsilon01 כי אתה עושה עליו SUM.
ז"א, קודם אתה אוסף את הנתונים, לפני הSUM.
עושה את הIF על כל הנתונים, גם על מה שלא נכלל בתנאי (ימים שהם לא יום ראשון בדוגמא שהוא הביא)
ובסוף אתה עושה את הSUM על הערכים שחזרו.
בקצת רשומות ובקשות זה בכלל לא משמעותי. אבל אם יש הרבה בקשות והרבה רשומות אני חשוב שזה טיפה יקר מבחינת ביצועים (לא בדקתי)
השיטה השנייה שהצעתי, לעשות תצוגה שמורה, יותר יעילה עקרונית, כי קודם נעשה WHERE על הרשומות, ומגיעים רק הרשומות הרלוונטיות, ועליהם נעשה הSUM, ורק אח"כ מחברים אותה לתצוגה הראשית עם JOIN (אפשר כמובן גם עם שאילתת משנה.)לא בדקתי את מה שאני כותב לעומק.
רק תחושת בטן וטיפה מנסיון שזה "נראה" רץ יותר יעיל וזריז. -
@upsilon01 כי אתה עושה עליו SUM.
ז"א, קודם אתה אוסף את הנתונים, לפני הSUM.
עושה את הIF על כל הנתונים, גם על מה שלא נכלל בתנאי (ימים שהם לא יום ראשון בדוגמא שהוא הביא)
ובסוף אתה עושה את הSUM על הערכים שחזרו.
בקצת רשומות ובקשות זה בכלל לא משמעותי. אבל אם יש הרבה בקשות והרבה רשומות אני חשוב שזה טיפה יקר מבחינת ביצועים (לא בדקתי)
השיטה השנייה שהצעתי, לעשות תצוגה שמורה, יותר יעילה עקרונית, כי קודם נעשה WHERE על הרשומות, ומגיעים רק הרשומות הרלוונטיות, ועליהם נעשה הSUM, ורק אח"כ מחברים אותה לתצוגה הראשית עם JOIN (אפשר כמובן גם עם שאילתת משנה.)לא בדקתי את מה שאני כותב לעומק.
רק תחושת בטן וטיפה מנסיון שזה "נראה" רץ יותר יעיל וזריז. -
@clickone לא נכון.
הIF אמור להיות מבוצע בשאילתת הSQL.
אם מתאים התנאי הערך הוא הסכום, ואם לא, 0. והחישוב הוא רק על השדה המחושב שמכיל את הנתונים המחושבים.מה שכן שבWHERE שיכניס רק מה שהוא רוצה, ובכך ימנע משליפה מיותרת.
@Shmuel754 אתה צודק. אבל הוא רוצה לעשות SUM על הכל, ובנוסף עוד SUM עם תנאי.
אז אין לו כאן WHERE.
בעצם הSQL אמור קודם לחשב את הכל, ואח"כ לרוץ לעשות SUM.
ולכן כתבתי מה שכתבתי.
ושוב, לדעתי כדאי שמישהו יעשה בדיקה ויודיענו דבר