ביצוע שאילתא על כל הקבוצות בטבלה
-
(נראה לי שזה שאלה פשוטה אבל אני לא מצליח למצוא את מילות חיפוש בשביל זה בגוגל)
יש לי מסד נתונים עם משתמשים שמחולקים לקבצות
אני רוצה לבצע שאילתות לפי קבוצה
למשל מה הממוצע הציונים בכל כיתה
אז אם יש לי טבלה של "ילד,ציון,כיתה"
אני רוצה לקבל קודם את כל הקבוצות (אני לא יודע מראש מה כל הקבוצות)
ולקבל את הSUMואת הCONT של כל קבוצה
(את הממצוע אני יחשב לבד)
השאלה היא האם אני צריך לעשות את זה בשני שאילתות או שיש דרך לשלב את זה בשאילתא אחת? -
@dovid
עכשיו משהו קצת יותר מסובך
יש לי טבלה עם נתונים של חידון עם העמודות
room,user,points,time,group
כל פעם שמישהו עונה אני רושם איזה חידון (room) את המשתמש, כמה נקודות הוא קיבל,את הזמן (לא רלוונטי כרגע)
ואת הקבוצה שלואני רוצה לקבל את הנתונים של כל קבוצה
- מה הקבוצה עם הכי הרבה נקודות+ עם הזמן הכי נמוך
- את המיקום שלה בסדר הנ"ל (אני יכול ליצור את זה גם בלולאה מחוץ לשאילתא כנראה)
- את הממצוע של הנקודות של כל קבוצה
לגבי ה2 הראשונים הסתדרתי עם מדריכים מסטאק אוברפלאו
SELECT rank ,group FROM ( SELECT points.*, @rank := @rank + 1 rank FROM ( SELECT grup,time FROM points where room =123 GROUP BY ;group ) points, (SELECT @rank := 0) init ORDER BY SumPoints DESC,time ASC ) r;"
השאלה היא איך אני מוציא את הערך של הממוצע של הקבוצה?
(אם זה מסבך את העניינים אני יכול לוותר על הrank ולהוסיף אותו ע"י לולאה מחוץ לשאילתא) -
הרבה ממה שאמרת לא הבנתי, והשאר לא בטוח הבנתי...
במיוחד לא הבנתי את הקוד, הוא נראה לא תקני מלבד מה שהוא היה שורה אחת שניסיתי לסדר בהזחות, אנא תעשה עיצוב מינימלי להבא לטובת שוחרי טובתך.
(כמו"כ שים לב אחרי שאתה כותב הודעה לקרוא אותה כאילו אתה לא כתבת אותה, ותראה אם זה מובן. למשל: "כל פעם שמישהו עונה אני רושם איזה חידון (room)". לא הבנתי, אני לא אתפלא אם בגלל זה התשובה שלי מוטעית לחלוטין).
אני אכתוב ממה שקצת הבנתי ותתקן אותי איפה טעיתי.SELECT group, SUM(points) AS `POINTS`, SUM(time) AS `TIME`, SUM(points) / SUM(time) AS `RANK`, AVG(points) AS `AVRAGE_POINTS` FROM points GROUP BY group ORDER BY AVRAGE_POINTS DESC
-
@nigun אמר בביצוע שאילתא על כל הקבוצות בטבלה:
ערבבת כאן כמה דברים:אני רוצה לקבל את הנתונים של כל קבוצה
מה הקבוצה עם הכי הרבה נקודות+ עם הזמן הכי נמוך
את המיקום שלה בסדר הנ"ל (אני יכול ליצור את זה גם בלולאה מחוץ לשאילתא כנראה)תוסיף לשאילתה למעלה
SELECT כיתה, COUNT(*), SUM(ציון) AS TotalMark, AVG(ציון) AS AverageMark, SUM(זמן) AS TotalTime FROM TABLE GROUP BY כיתה
ותשרשר שאילתות קיבוץ נוספות על השאילתה הנ"ל, למשל לקבלת הכיתה עם הציון הכי גבוה
SELECT T.כיתה, MAX(T.TotalMark) FROM ( SELECT כיתה, COUNT(*), SUM(ציון) AS TotalMark, AVG(ציון) AS AverageMark, SUM(זמן) AS TotalTime FROM TABLE GROUP BY כיתה) AS T GROUP BY T.כיתה
למעשה אתה לא צריך את כל השדות המקוריים, רק את הציון והכיתה, אז מספיק לכתוב כך:
SELECT T.כיתה, MAX(T.TotalMark) FROM ( SELECT כיתה, SUM(ציון) AS TotalMark FROM TABLE GROUP BY כיתה) AS T GROUP BY T.כיתה
את הממצוע של הנקודות של כל קבוצה
זה לא מה שכבר מחושב למעלה?
SELECT ..... AVG(ציון)
-
@dovid
צודק
@OdedDvir
אני צריך ממוצע של המשתמש בקבוצה
זאת אומרת כל שורה כתוב כמה נקודות המשתמש קיבל על השאלה הספיציפית
למשל אם ענה על שלוש שאלות יש שלוש שורות שכתוב בהם 5 נקודות
אם בקבוצה יש 10 תלמידים אז יש 30 שורות שכתוב בהם (בעמודה של נקודות) 5
אם אני יעשה ממוצע אני יקבל כנראה את הספרה 5
ואם אני יעשה סיכום של הקבוצה אני יקבל 50
אבל אני רוצה לקבל את הממוצע של הקבוצה פר משתמש
זאת אומרת 15.בהמשך היום אני אתיישב לכתוב בישוב הדעת משהו יותר ברור
-
@nigun אמר בביצוע שאילתא על כל הקבוצות בטבלה:
אבל אני רוצה לקבל את הממוצע של הקבוצה פר משתמש
זאת אומרת 15.בסדר, גם פה אפשר שתי שאילתות קיבוץ משורשרות, ברשותך אני אכתוב רק באנגלית כי זה הכי נוח לי:
א - חישוב סה"כ ניקוד לתלמידSELECT ClassID, StudentID, SUM(Score) AS StudentTotalScore FROM table GROUP BY ClassID, StudentID
ב - חישוב הממוצע של הכיתה:
SELECT T.ClassID, AVG(T.StudentTotalScore) AS ClassAverageScore FROM (SELECT ClassID, StudentID, SUM(Score) AS StudentTotalScore FROM table GROUP BY ClassID, StudentID ) AS T GROUP BY T.ClassID