שאילתא על ממוצע

eladros

New member
שאילתא על ממוצע

יש לי טבלה עם 3 שדות: date, amount ,id עבור id שנתון לי עלי לשלוף את ממוצע הסכום שהתקבל בכל יום במשך 10 הימים האחרונים. העניין הוא שהממוצע הוא לא על סה"כ הרשומות אלא קודם כל יש ממוצע עבור כל יום, כלומר אם ביום אחד היו 2 רשומות - אחת עם סכום 100 והשניה 200 אז הממוצע של היום הזה הוא 150 וזה הסכום שישתתף בממוצע עם שאר הימים שגם יחושבו בדרך דומה במקרה שיש יותר מרשומה אחת. העבודה ב ORACLE. אשמח לעזרה.
 

א ו ר ח ת

New member
שאילתה מבוססת שאילתה

בהתחלה תעשה שאילתה שמציגה ממוצע ליום . אחרי זה שאילתה שה form שלה הוא השאילתה הראשונה ככה:
select avg(xx) from (select avg(amount) as xx from tbl where ...) as yy​
 

s h i m s h o n

New member
../images/Emo45.gif לדוגמה

משהו כזה:
select avg(amount) from ( select avg(amount) amount from tbl group by to_char(date_col, 'dd/mm/yyyy') )​
בברכה, ש.
 

eladros

New member
האם

את ה- WHERE מכניסים לפני ה GROUP BY - כלומר רק בשאילתא הפנימית 30 - where date_col >= sysdate כמו כן: האם אי אפשר לעשות GROUP BY על שדה DATE כמו שהוא בלי המרה של TO_CHAR? באותו נושא: האם אפשר לעשות (max(date_col או שצריך להמיר למחרוזת?
 

s h i m s h o n

New member
תשובות

1. בתוך שאילתת SQL, ה-WHERE בא תמיד לפני ה-GROUP BY (לא רק באורקל). במקרה הספציפי הזה, ישנן שתי שאילתות אחת בתוך השניה (שאילתא מקוננת) ולכן הכלל הזה חל על כל אחת מהן בנפרד. כלומר: בתוך השאילתא הפנימית, ה-WHERE בא לפני ה-GROUP BY וכנ"ל לגבי השאילתא החיצונית. מאחר והשאילתא הפנימית נמצאת בחלק ה-FROM של החיצונית, יתקבל שגם ה-WHERE וגם ה-GROUP של השאילתא החיצונית נמצאים אחריה. 2.אפשר לעשות GROUP על תאריך שים לב, שתאריכים באורקל מוחזקים עד רמת השניה ולכן לא בטוח שזה מה שתרצה לעשות (ומכאן ה-TO_CHAR). אם מלכתחילה כל התאריכים בעמודה שמורים ללא שעות/דקות/שניות (Truncated), ביצוע GROUP עליה אכן ייתן קיבוץ לפי יום. 3. אפשר בהחלט (ורצוי!) לעשות MAX/SUM/AVG לתאריך ללא המרה. שים לב: כוונתי לא להמיר לפני הפעלת הפונקציה. אחריה כדאי להמיר כדי להציג פורמט יפה. כלומר: זה כן:
TO_CHAR(MAX(dt), 'DD/MM/YYYY HH24:MI:SS')​
זה לא:
MAX(TO_CHAR(dt, 'DD/MM/YYYY HH24:MI:SS'))​
בברכה, ש.
 
למעלה