צפיות
תשובות
בעיה ב-SQL
שלום לכולם!
אני עדיין תקוע במערכת הסקרים ההיא… שיניתי את מבנה בסיס הנתונים שלי(משלוש טבלאות, כמו שזהר פלד אמר לי, לשתי טבלאות, כי אז קיבלתי הודעת שגיאה שה- RS ריק למרות שהכל היה בדדר וכמו שצריך…..)
הנה קוד ה-SQL החדש:
sql = "SELECT"
sql = sql & " tbl_a.id as answerID,"
sql = sql & " tbl_a.answer as answer,"
sql = sql & " tbl_a.question_id as question_id,"
sql = sql & " tbl_a.hits as hits,"
sql = sql & " SUM(tbl_a.hits) as total_hits,"
sql = sql & " tbl_q.id as questionID,"
sql = sql & " tbl_q.author as author,"
sql = sql & " tbl_q.dmy as dmy,"
sql = sql & " tbl_q.status as status,"
sql = sql & " tbl_q.question as question"
sql = sql & " FROM"
sql = sql & " tbl_a, tbl_q"
sql = sql & " WHERE "
sql = sql & " tbl_q.id = tbl_a.question_id"
sql = sql & " AND"
sql = sql & " tbl_q.status = 1"
sql = sql & " GROUP BY"
sql = sql & " answerID,answer,question_id,questionID,author,dmy,status,question"
sql = sql & " ORDER BY tbl_a.id"
והנה השגיאה:
Error Type:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'answerID' as part of an aggregate function.
בבקשה תעזרו לי עם הזה…. אני מייואש כבר….
האם הקוד נכון בכלל? האם אני מחשב את מספר ההצבעות הכללי באופן נכון?
וגם בשליפה(טופס שמציג את שאלה הסקר ואת האפשרויות) יש לי בעיה: הדף בכלל לא עולה!
תודה, אלברט
אני אביא את הקוד שלו אחרי שאני אסדר את העמוד הזה(עמוד ה"תוצאות")….
50 תשובות
תבדוק …
נסה להוריד את ה-answerID מה-GROUP BY אולי (אני חושב)
לא עזר…
מה השגיאה אומרת?
ומה הבעיה בקוד?
נסה אולי
לתת את השמות האמיתיים של השדות ולא את השמות שהגדרת אחרי AS
וואלה! תודה! אבל:
כשאני מנסה "להדפיס" את מס' ההצבעות הכללי, הוא לא מחשב לי את סכום ההצבעות של כל התשובות אלא נותן לי רק את מס' ההצבעות לאותה התשובה…
מה אני עושה?
אתה צריך לחשב
את סכום ההצבעות ע"י חיבור הנתונים
אני לא מכיר דרך אחרת אולי מישהו אחר מכיר
ברור, אבל:
איך אני "מחבר את הנתונים"?
בקוד שכתבתי, זהר פלד אמר שזה בסדר, אבל אני לא יודע למה אבל הוא לא לא מחשב לי את סכום כל ההצבעות ששיככות לשאלה מסויימת אלא "סכום" של עמודה אחת, כלומר, הוא לא עושה כלום….
כך
עושה משתנה (לדוגמא allCount)
ומחבר בתוכו ע"י שימוש ב-cint את הנתונים
allCount = cint(rs.fields("hit") + rs.fields("hit"))
זה יתן לי את סכום כל ההצבעות?
מאוד מוזר:
המשך:
קודם כל סליחה… בטעות לחצתי על ENTER במקום TAB….
הקוד הזה שנתת לי הוא מוזר לאללה… הוא לוקח מספר של הצבעה ומחבר עם עצמו, לא כך?
השאלה שלי היא איך אני מחשב את סכום כל ההצבעות?
תודה, אלברט
הכוונה שלי
שכל פעם תיתן שדה אחר ברקורדסט (שכחתי להוסיף 1 בRS השני)
ואז ע"י חיבור ועשייתו משתנה טבעי (לא עם מס' עם שברים)
אז נגיד יש לנו 3 שדות וברקורדסט זה מופיע כך :::
hit1 – 5
hit2 – 9
hit3 – 10
אז משתנה ה=ALLCOUNT יראה כך :::
allCount = cint(rs.Feilds("hit1") + rs.Fields("hit2") + rs.Fields("hits3"))
שזה בעצם יוציא פלט כזה
allCount = cint(5+9+10)
allCount = 24
אבל:
1) אני לא יודע כמה תשובות יש לסקר.
2) גם אם כן, אני לא יכול לעבור על RS פעמיים(כאילו לעבור עליו כדי לחשב את הסכום ולעבור עליו שוב כדי לרשום את שאלת הסקר, תשובה וכו'…
3) ל-מה נודעה הפקודה COUNT או SUM?
הן אמורות לחבר את השדות….. ככה אמר לי זהר פלד, שצריך להשתמש בפונ' האלו ישר בתוך שורת הSQL כדי לחשב את הסכום…
תודה, אלברט
אלברט…
תביא שנייה את השאילתא המתוקנת ולא בתוך המשתנה את השאילתא עצמה
כאילו והיית מכניס אותה לעורך ה-SQL של אקסס (ודומיו)
הנה:
אני מקווה שהבנתי אותך נכון…
sql = "SELECT"
sql = sql & " tbl_a.id as answerID,"
sql = sql & " tbl_a.answer as answer,"
sql = sql & " tbl_a.question_id as question_id,"
sql = sql & " tbl_a.hits as hits,"
sql = sql & " SUM(hits) as total_hits,"
sql = sql & " tbl_q.id as questionID,"
sql = sql & " tbl_q.author as author,"
sql = sql & " tbl_q.dmy as dmy,"
sql = sql & " tbl_q.status as status,"
sql = sql & " tbl_q.question as question"
sql = sql & " FROM"
sql = sql & " tbl_a, tbl_q"
sql = sql & " WHERE "
sql = sql & " tbl_q.id = tbl_a.question_id"
sql = sql & " AND"
sql = sql & " tbl_q.id = "&id&""
sql = sql & " AND"
sql = sql & " tbl_q.status = 1"
sql = sql & " GROUP BY"
sql = sql & " tbl_a.id,tbl_a.answer,tbl_a.question_id,tbl_a.hits,tbl_q.id,tbl_q.author,tbl_q.dmy ,tbl_q.status,tbl_q.question"
sql = sql & " ORDER BY tbl_a.id"
תודה, אלברט
אלברט
התכוונתי רק את השאילתא בלי הכנסתו למשתנה
ככה:?
כאילו הכל ברצף?(סליחה על הבורות שלי…)
SELECT tbl_a.id as answerID, tbl_a.answer as answer, tbl_a.question_id as question_id, tbl_a.hits as hits, SUM(hits) as total_hits, tbl_q.id as questionID, tbl_q.author as author, tbl_q.dmy as dmy, tbl_q.status as status, tbl_q.question as question FROM tbl_a, tbl_q WHERE tbl_q.id = tbl_a.question_id AND tbl_q.id = AND tbl_q.status = 1 GROUP BY tbl_a.id,tbl_a.answer,tbl_a.question_id,tbl_a.hits,tbl_q.id,tbl_q.author,tbl_q.dmy ,tbl_q.status,tbl_q.question ORDER BY tbl_a.id
תודה, אלברט
עוד משהו קטן
ראיתי שיש לך tbl_a.hits as hits
ושיש לך SUM(hits) as total_hits
עכשיו השדה hits זה שנמצא בפונקצייה sum זה שדה בפני עצמו או השדה שכך קראת לו ע"י AS ???
=>
זה שדה בפני עצמו: tbl_a.hits
כלומר לקחתי את השדה hits באופן בודד כדי להציג אותו וניסיתי לעשות על כל השדות בשם hits את הפונ' SUM…
לגבי השאלה שלך, כן זה שדה בפני עצמו אבל אותו שדה של tbl_a.hits as hits
תודה, אלברט
אז הנה התשובה
חישוב כל השדות מתבצע ע"י השדה total_hits שלך (ה-alias של פונקציית sum) ואתה פשוט מדפיס אותו
=>
אני יודע, אבל בדיוק פה הבעיה…. כשאני מנסה לדפיס אותו הוא לא נותן לי את מס' ההצבעות הכללי, דוגמה:
מס' תשובה | ההצבעה
1 | 4
2 | 7
3 | 5
4 | 8
5 | 2
6 | 4
מס' ההצבעות הכללי אמור להיות: 30
אבל, כשאני מנסה להדפיס את תשובה מסויימת ולידה מס' ההצבעות הכללי זה שפוט נותן לי את מס' ההצבעות עבור אותה התשובה, דוגמה:
מס' תשובה(אותם הנתונים מהדוגמה הקודמת) | מס' ההצבעות הכללי
1 | 4 (במקום 30, שזה מס' ההצבעות הכללי)
2 | 7 (כנ"ל)
3 | 5 (כנ"ל)
4 | 8 (כנ"ל)
5 | 2 (כנ"ל)
6 | 4 (כנ"ל)
לפי דעתי הוא לא מחשב את סכום כל השדות בשם hits (שמתאימות לשאלה נתונה) אלא רק מחשב את סכום שדה אחד, כלומר לא עושה כלום בעצם…
מה אני עושה?
תודה, אלברט
תעשה בלולאה
תעשה לולאה שרצה על הרקורדסט
for i=0 to rs.RecordCount
total_hits = total_hits + rs.Fields("total_hits")
next
כמובן שאתה יכול לעשות זאת בריצה של הלולאה הראשית כדי לחסוך במשאבי השרת
=>
אם אני עושה לולאה כדי לחשב את מס' ההצבעות הכללי אז ל-מה אני צריך את הפונקציה SUM()?
תודה, אלברט
שמע הפונקצייה
אצלך מחשבת SUM לכל קבוצה מסוימת ולא של כל העמודה ולכן עושים את החיבור הבנת?!!!
[ללא נושא]
=>
לא… לא ממש הבנתי….
מה זא הפונ' מחשבת SUM לכל קבוצה?
אגב, גם כשעשיתי (או יותר נכון הוספתי את הקוד שכתבת..) הקוד עדיין לא עובד כמו שצריך.. אני עדיין מקבל את אותם המס' שקיבלתי אז…
מה הבעיה כאן?
תודה, אלברט
עצם השימוש שלך ב-group BY
יצר לך קבוצות עוד הסברים אתה יכול למצוא ב-MSDN במדריך ה-SQL באתר
וכאן :::
נסה להוריד את השדה…
tbl_a.hits מהפסוקית group by ותראה את התוצאות
=>
טוב, את ההסבר קראתי לפני כן… אבל בכל זאת לא הבנתי את הפסוקית… לא משנה, אולי אני אבין את זה מאוחר יותר עם הזמן(יש לי עוד איזה חודש ומשהו עד הבחינה…)
אתה יכול להגיד בקיצור איך אני מחשב את מס' ההצבעות הכללי? כי הקוד שהבאת לי לפני כן לא עבד…
תודה רבה רבה לך על העזרה, אלברט
=>
זה ייתן לי הודעת שגיאה
כי לפי ההסבר "כל השדות שלא מופעלות עליהן פונ' צבירה כלשהי צריכות להופיע בפסוקית GROUP BY"
אבל תראה…
באותו עמוד של ה-group by יש למעלה בתחילת העמוד הסבר קטן שאם יש את השאילתא הבאה :::
SELECT COUNT(Title)
FROM Titles
אז נקבל את סה"כ הספרים בטבלה
אז נסה לעשות את מה שאמרתי לך להוריד את השדה מ-group by
אני אנסה להסביר עוד פעם את זה…
לפי השרשור הזה, באמת לא הבנת את Group by.
מה שהפסוקית הזו עושה הוא לקבץ רשומות בטבלה לפי ערכים זהים בשדות שמופיעים בה.
מה זה אומר – בדיוק מה שראית – ה SUM בשאילתה שלך נכון לגבי כל תשובה בנפרד.
כדי לחשב את מספר ההצבעות הכולל, אתה צריך להשתמש במשתנה שיסכם את כל ההצבעות בכל ה recordset שלך, ורק בסוף הלולאה תוכל לדעת מה סכום כל ההצבעות בסקר.
הרי במילא אתה כותב לולאה שתרוץ על ה recordset שלך כדי להציג את הנתונים, נכון? אז בלולאה הזו תבצע גם את החישוב. זה מה ש nirtheking ניסה לומר לך לאורך כל השרשור.
זוהר ?!!!
אבל בקשר לפעולת ה-SUM צדקתי שאם מורידים את השדה שנמצא ב-SUM מה-group by אז יחשב לכל השדות בעמודה ???
לא חושב…
אם תוריד את ה GROUP BY בכלל תוכל לחשב SUM של כל הטבלה.
ברגע שיש לך GROUP BY אתה יכול רק לחשב SUM לפי הקבוצות של ה GROUP BY.
התכוונתי
שהוא יוריד את השדה שלו (hits בשמו המקוצר) מהפסוקית של group by
חתיכת שרשור עשינו כאן!!!
הבנתי את הכוונה שלך כבר קודם,
זה לא משנה את התשובה שלי.
=>
שני דברים:
א. אכן כן, עשינו חתיכת שרשור…
ב. אם אני צריך לעשות לולאה שכל פעם מוסיפה למשתנה all_hits(שהוא יהיה סכום כל ההצבעות) אז למה אני צריך להשתמש בפונ' צבירה SUM ולאחר מכן להשתמש ב- GROUP BY? הרי גם ככה אני עובר בלולאה ומוסיף למשתנה ערך לפי ההצבעות של כל תשובה….
הנה הקוד בלי פונ' SUM ובלי GROUP BY:
sql = "SELECT"
sql = sql & " tbl_a.id as answerID,"
sql = sql & " tbl_a.answer as answer,"
sql = sql & " tbl_a.question_id as question_id,"
sql = sql & " tbl_a.hits as hits,"
sql = sql & " tbl_q.id as questionID,"
sql = sql & " tbl_q.author as author,"
sql = sql & " tbl_q.dmy as dmy,"
sql = sql & " tbl_q.status as status,"
sql = sql & " tbl_q.question as question"
sql = sql & " FROM"
sql = sql & " tbl_a, tbl_q"
sql = sql & " WHERE "
sql = sql & " tbl_q.id = tbl_a.question_id"
sql = sql & " AND"
sql = sql & " tbl_q.id = "&id&""
sql = sql & " AND"
sql = sql & " tbl_q.status = 1"
sql = sql & " ORDER BY tbl_a.id"
ג. הורדתי את מה שאמרת להוריד וקיבלתי הודעת שגיאה…
לא הבנת (אלברט)
לא התכוונתי שתוריד את כל הפסוקית group by אלא רק את השדה שעליו אתה עושה את ה-sum תוריד ותבדוק מקסימום תבצע לולאה זה מה שאני תמיד עושה אני לא אוהב להסתבך עם ה-SQL
=>
הבנתי אותך מעולה… וזה מה שעשיתי… מהתחלה השדה שהיה מופעלת עליו הפונ'SUM לא היה ב-GROUP BY..
השאלה שלי היא כזאת:
אם אני צריך לעשות לולאה כדי לחשב את סכום ההצבעות בכללי(ע"י חיבור של הנתונים) אז למה אני צריך להשתמש בפונ' SUM ופסוקית GROUP BY?
תודה, אלברט
המשך השרשורפלצת….
הפונקציה sum לא אמורה לחשב לך את סך כל ההצבעות – היא אמורה לחשב את סך כל ההצבעות לתשובה ספציפית. (שזה בדיוק מה שקורה).
אם אתה רוצה לחשב את סך כל ההצבעות בעזרת שאילתה, אתה צריך לשלוף sum של סך ההצבעות ללא שימוש ב GROUP BY. מכיון שיותר יעיל לשלוח שאילתה אחת למסד הנתונים מאשר שתיים, אתה מחשב את סך כל ההצבעות בזמן הריצה על ה recordset… אני לא מאמין שאני יכול להסביר את זה בצורה פשוטה יותר.
=>
את סה"כ הצבעות לתשובה ספיציפית אני לא צריך לחשב בכלל, כי לכל תשובה יש שדה הצבעות משלה כל מה שנשאר לי זה לשלוף אותו מה טבלה….
ולגבי המשפט השני שלך, אם אני לא אשתמש ב GROUP BY, אני אקבל שגיאה לא? "כל השדות שלא מופעלות עליהן פונ' צבירה צריכות להופיע ב GRIUP BY"(לפי ילדה בלבן)
מתי בדיוק אני שלחתי שתי שאילתות למס, הנתונים?ומה הכוונה "לשלוח שתי שאילתות"? ולמה אמרת לי שאני צריך להשתמש ב COUNT כדי לחשב את כמות ההצבעות הכללית? הרי COUNT נותן לי את מס' השדות ואני צריך סכום של כמה שדות…
ושאלה אחרונה: אתה יכול לתת לי דוגמא לשאילתה שמחשבת את סך כל ההצבעות?(כלומר בלי להריץ לולאה…מה שניסיתי לעשות בהתחלה…ניסיתי לעשות SUM לכל השדות של hits שכל אחת מהן היא כך הצבעות לתשובה מסויימת…)
תודה רבה, אלברט
אלברט שמע
בקשר ל-group by זה לא רלוונטי לגבי השאילתא שלך לכן תעשה את הדבר הבא
בלולאה שרצה על הRS אז תשים את הדבר הבא
countAll = countAll + rs.Fields("total_hits")
ושורה אחרי הסיום של הלולאה (next) תעשה הוצאת פלט (response.write ) של המשתנה הזה
Response.Write(countAll)
nirtheking
זה בדיוק מה שעשיתי והכל "בסדר"… אבל אני רוצה שהשאילתה שלי תהיה יותר מתוחכמת ושתחשב לי את סכום ההצבעות הכליי בעצמה.. בלי לולאה….
אפשרי?
תודה, אלברט
שתמח במה שיש לך כי
לדעתי השאילתא לא יכולה לעשות יותר מזה בגלל שזה מחלק לקבוצות ואתה לא יכול שלא לעבוד בלי הקבוצות אז זהו הדיון הושלם ותם
כל כך הרבה שאלות…
נראה לי שבמקום לעזור לך רק סיבכתי אותך עוד יותר….
לגבי סכום ההצבעות לכל תשובה, אתה צודק – אין צורך ב sum, טעות שלי.
לגבי המשפט שלי של "בלי להשתמש ב group by", הכוונה היא ליצור שאילתה נפרדת לגמרי שמיועדת אך ורק לחישוב סך כל ההצבעות – (זו גם הכוונה ב " שיותר יעיל לשלוח שאילתה אחת למסד הנתונים מאשר שתיים" שכתבתי בהודעה הקודמת).
לגבי count שאמרתי לך להשתמש בו, פשוט התבלבלתי בין count ל sum.
שאילתה שתחשב את סך כל ההצבעות:
SELECT SUM(intNumOfVotes) FROM votesTable
כמובן ,intNumOfVotes הוא השדה ששומר בתוכו את מספר המצביעים לכל תשובה, ו VotesTable היא טבלת התוצאות של הסקר.
בקיצור – מכל הסיבוך הזה הסתבכנו והתבלבלנו שנינו… לא נורא – זה קורה במשפחות הכי טובות…
ישאיר את ה-SUM
כך הוא יוכל לעבור בלולאה ולחשב את הסכום הכולל
תודה רבה רבה לך ול- nirtheking!
על לא דבר
יש מצב ש:
השרשור הזה הוא השרשור הכי ארוך בפורום?
על בטוח בתנאי..
שנמשיך למלות בשטויות כמו אלו
הצפה
דבר שעשוי בהחלט בכל הפורומים (לא ממליץ)