שלח תשובה

זירת השאלות

791
צפיות
50
תשובות

בעיה ב-SQL

,‏ 3 בפברואר, 2004

שלום לכולם!
אני עדיין תקוע במערכת הסקרים ההיא… שיניתי את מבנה בסיס הנתונים שלי(משלוש טבלאות, כמו שזהר פלד אמר לי, לשתי טבלאות, כי אז קיבלתי הודעת שגיאה שה- 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 תשובות

  1. ניר טייב הגיב:

    תבדוק …
    נסה להוריד את ה-answerID מה-GROUP BY אולי (אני חושב)

  2. albert הגיב:

    לא עזר…
    מה השגיאה אומרת?
    ומה הבעיה בקוד?

  3. ניר טייב הגיב:

    נסה אולי
    לתת את השמות האמיתיים של השדות ולא את השמות שהגדרת אחרי AS

  4. albert הגיב:

    וואלה! תודה! אבל:
    כשאני מנסה "להדפיס" את מס' ההצבעות הכללי, הוא לא מחשב לי את סכום ההצבעות של כל התשובות אלא נותן לי רק את מס' ההצבעות לאותה התשובה…
    מה אני עושה?

  5. ניר טייב הגיב:

    אתה צריך לחשב
    את סכום ההצבעות ע"י חיבור הנתונים
    אני לא מכיר דרך אחרת אולי מישהו אחר מכיר

  6. albert הגיב:

    ברור, אבל:
    איך אני "מחבר את הנתונים"?
    בקוד שכתבתי, זהר פלד אמר שזה בסדר, אבל אני לא יודע למה אבל הוא לא לא מחשב לי את סכום כל ההצבעות ששיככות לשאלה מסויימת אלא "סכום" של עמודה אחת, כלומר, הוא לא עושה כלום….

  7. ניר טייב הגיב:

    כך
    עושה משתנה (לדוגמא allCount)
    ומחבר בתוכו ע"י שימוש ב-cint את הנתונים

    allCount = cint(rs.fields("hit") + rs.fields("hit"))

  8. albert הגיב:

    המשך:
    קודם כל סליחה… בטעות לחצתי על ENTER במקום TAB….
    הקוד הזה שנתת לי הוא מוזר לאללה… הוא לוקח מספר של הצבעה ומחבר עם עצמו, לא כך?
    השאלה שלי היא איך אני מחשב את סכום כל ההצבעות?

    תודה, אלברט

  9. ניר טייב הגיב:

    הכוונה שלי
    שכל פעם תיתן שדה אחר ברקורדסט (שכחתי להוסיף 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

  10. albert הגיב:

    אבל:
    1) אני לא יודע כמה תשובות יש לסקר.
    2) גם אם כן, אני לא יכול לעבור על RS פעמיים(כאילו לעבור עליו כדי לחשב את הסכום ולעבור עליו שוב כדי לרשום את שאלת הסקר, תשובה וכו'…
    3) ל-מה נודעה הפקודה COUNT או SUM?
    הן אמורות לחבר את השדות….. ככה אמר לי זהר פלד, שצריך להשתמש בפונ' האלו ישר בתוך שורת הSQL כדי לחשב את הסכום…

    תודה, אלברט

  11. ניר טייב הגיב:

    אלברט…
    תביא שנייה את השאילתא המתוקנת ולא בתוך המשתנה את השאילתא עצמה
    כאילו והיית מכניס אותה לעורך ה-SQL של אקסס (ודומיו)

  12. albert הגיב:

    הנה:
    אני מקווה שהבנתי אותך נכון…

    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"

    תודה, אלברט

  13. ניר טייב הגיב:

    אלברט
    התכוונתי רק את השאילתא בלי הכנסתו למשתנה

  14. albert הגיב:

    ככה:?
    כאילו הכל ברצף?(סליחה על הבורות שלי…)

    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

    תודה, אלברט

  15. ניר טייב הגיב:

    עוד משהו קטן
    ראיתי שיש לך tbl_a.hits as hits
    ושיש לך SUM(hits) as total_hits
    עכשיו השדה hits זה שנמצא בפונקצייה sum זה שדה בפני עצמו או השדה שכך קראת לו ע"י AS ???

  16. albert הגיב:

    =>
    זה שדה בפני עצמו: tbl_a.hits
    כלומר לקחתי את השדה hits באופן בודד כדי להציג אותו וניסיתי לעשות על כל השדות בשם hits את הפונ' SUM…
    לגבי השאלה שלך, כן זה שדה בפני עצמו אבל אותו שדה של tbl_a.hits as hits

    תודה, אלברט

  17. ניר טייב הגיב:

    אז הנה התשובה
    חישוב כל השדות מתבצע ע"י השדה total_hits שלך (ה-alias של פונקציית sum) ואתה פשוט מדפיס אותו

  18. albert הגיב:

    =>
    אני יודע, אבל בדיוק פה הבעיה…. כשאני מנסה לדפיס אותו הוא לא נותן לי את מס' ההצבעות הכללי, דוגמה:

    מס' תשובה | ההצבעה
    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 (שמתאימות לשאלה נתונה) אלא רק מחשב את סכום שדה אחד, כלומר לא עושה כלום בעצם…
    מה אני עושה?

    תודה, אלברט

  19. ניר טייב הגיב:

    תעשה בלולאה
    תעשה לולאה שרצה על הרקורדסט

    for i=0 to rs.RecordCount
    total_hits = total_hits + rs.Fields("total_hits")
    next

    כמובן שאתה יכול לעשות זאת בריצה של הלולאה הראשית כדי לחסוך במשאבי השרת

  20. albert הגיב:

    =>
    אם אני עושה לולאה כדי לחשב את מס' ההצבעות הכללי אז ל-מה אני צריך את הפונקציה SUM()?

    תודה, אלברט

  21. ניר טייב הגיב:

    שמע הפונקצייה
    אצלך מחשבת SUM לכל קבוצה מסוימת ולא של כל העמודה ולכן עושים את החיבור הבנת?!!!

  22. albert הגיב:

    =>
    לא… לא ממש הבנתי….
    מה זא הפונ' מחשבת SUM לכל קבוצה?
    אגב, גם כשעשיתי (או יותר נכון הוספתי את הקוד שכתבת..) הקוד עדיין לא עובד כמו שצריך.. אני עדיין מקבל את אותם המס' שקיבלתי אז…
    מה הבעיה כאן?

    תודה, אלברט

  23. ניר טייב הגיב:

    עצם השימוש שלך ב-group BY
    יצר לך קבוצות עוד הסברים אתה יכול למצוא ב-MSDN במדריך ה-SQL באתר
    וכאן ::: https://www.webmaster.org.il/forums/Message.asp?Id=3489

  24. ניר טייב הגיב:

    נסה להוריד את השדה…
    tbl_a.hits מהפסוקית group by ותראה את התוצאות

  25. albert הגיב:

    =>
    טוב, את ההסבר קראתי לפני כן… אבל בכל זאת לא הבנתי את הפסוקית… לא משנה, אולי אני אבין את זה מאוחר יותר עם הזמן(יש לי עוד איזה חודש ומשהו עד הבחינה…)
    אתה יכול להגיד בקיצור איך אני מחשב את מס' ההצבעות הכללי? כי הקוד שהבאת לי לפני כן לא עבד…
    תודה רבה רבה לך על העזרה, אלברט

  26. albert הגיב:

    =>
    זה ייתן לי הודעת שגיאה
    כי לפי ההסבר "כל השדות שלא מופעלות עליהן פונ' צבירה כלשהי צריכות להופיע בפסוקית GROUP BY"

  27. ניר טייב הגיב:

    אבל תראה…
    באותו עמוד של ה-group by יש למעלה בתחילת העמוד הסבר קטן שאם יש את השאילתא הבאה :::

    SELECT COUNT(Title)
    FROM Titles

    אז נקבל את סה"כ הספרים בטבלה

    אז נסה לעשות את מה שאמרתי לך להוריד את השדה מ-group by

  28. זהר פלד הגיב:

    אני אנסה להסביר עוד פעם את זה…
    לפי השרשור הזה, באמת לא הבנת את Group by.
    מה שהפסוקית הזו עושה הוא לקבץ רשומות בטבלה לפי ערכים זהים בשדות שמופיעים בה.
    מה זה אומר – בדיוק מה שראית – ה SUM בשאילתה שלך נכון לגבי כל תשובה בנפרד.
    כדי לחשב את מספר ההצבעות הכולל, אתה צריך להשתמש במשתנה שיסכם את כל ההצבעות בכל ה recordset שלך, ורק בסוף הלולאה תוכל לדעת מה סכום כל ההצבעות בסקר.
    הרי במילא אתה כותב לולאה שתרוץ על ה recordset שלך כדי להציג את הנתונים, נכון? אז בלולאה הזו תבצע גם את החישוב. זה מה ש nirtheking ניסה לומר לך לאורך כל השרשור.

  29. ניר טייב הגיב:

    זוהר ?!!!
    אבל בקשר לפעולת ה-SUM צדקתי שאם מורידים את השדה שנמצא ב-SUM מה-group by אז יחשב לכל השדות בעמודה ???

  30. זהר פלד הגיב:

    לא חושב…
    אם תוריד את ה GROUP BY בכלל תוכל לחשב SUM של כל הטבלה.
    ברגע שיש לך GROUP BY אתה יכול רק לחשב SUM לפי הקבוצות של ה GROUP BY.

  31. ניר טייב הגיב:

    התכוונתי
    שהוא יוריד את השדה שלו (hits בשמו המקוצר) מהפסוקית של group by

  32. זהר פלד הגיב:

    הבנתי את הכוונה שלך כבר קודם,
    זה לא משנה את התשובה שלי.

  33. albert הגיב:

    =>
    שני דברים:
    א. אכן כן, עשינו חתיכת שרשור…
    ב. אם אני צריך לעשות לולאה שכל פעם מוסיפה למשתנה 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"

    ג. הורדתי את מה שאמרת להוריד וקיבלתי הודעת שגיאה…

  34. ניר טייב הגיב:

    לא הבנת (אלברט)
    לא התכוונתי שתוריד את כל הפסוקית group by אלא רק את השדה שעליו אתה עושה את ה-sum תוריד ותבדוק מקסימום תבצע לולאה זה מה שאני תמיד עושה אני לא אוהב להסתבך עם ה-SQL

  35. albert הגיב:

    =>
    הבנתי אותך מעולה… וזה מה שעשיתי… מהתחלה השדה שהיה מופעלת עליו הפונ'SUM לא היה ב-GROUP BY..
    השאלה שלי היא כזאת:
    אם אני צריך לעשות לולאה כדי לחשב את סכום ההצבעות בכללי(ע"י חיבור של הנתונים) אז למה אני צריך להשתמש בפונ' SUM ופסוקית GROUP BY?

    תודה, אלברט

  36. זהר פלד הגיב:

    המשך השרשורפלצת….
    הפונקציה sum לא אמורה לחשב לך את סך כל ההצבעות – היא אמורה לחשב את סך כל ההצבעות לתשובה ספציפית. (שזה בדיוק מה שקורה).
    אם אתה רוצה לחשב את סך כל ההצבעות בעזרת שאילתה, אתה צריך לשלוף sum של סך ההצבעות ללא שימוש ב GROUP BY. מכיון שיותר יעיל לשלוח שאילתה אחת למסד הנתונים מאשר שתיים, אתה מחשב את סך כל ההצבעות בזמן הריצה על ה recordset… אני לא מאמין שאני יכול להסביר את זה בצורה פשוטה יותר.

  37. albert הגיב:

    =>
    את סה"כ הצבעות לתשובה ספיציפית אני לא צריך לחשב בכלל, כי לכל תשובה יש שדה הצבעות משלה כל מה שנשאר לי זה לשלוף אותו מה טבלה….
    ולגבי המשפט השני שלך, אם אני לא אשתמש ב GROUP BY, אני אקבל שגיאה לא? "כל השדות שלא מופעלות עליהן פונ' צבירה צריכות להופיע ב GRIUP BY"(לפי ילדה בלבן)
    מתי בדיוק אני שלחתי שתי שאילתות למס, הנתונים?ומה הכוונה "לשלוח שתי שאילתות"? ולמה פה אמרת לי שאני צריך להשתמש ב COUNT כדי לחשב את כמות ההצבעות הכללית? הרי COUNT נותן לי את מס' השדות ואני צריך סכום של כמה שדות…
    ושאלה אחרונה: אתה יכול לתת לי דוגמא לשאילתה שמחשבת את סך כל ההצבעות?(כלומר בלי להריץ לולאה…מה שניסיתי לעשות בהתחלה…ניסיתי לעשות SUM לכל השדות של hits שכל אחת מהן היא כך הצבעות לתשובה מסויימת…)

    תודה רבה, אלברט

  38. ניר טייב הגיב:

    אלברט שמע
    בקשר ל-group by זה לא רלוונטי לגבי השאילתא שלך לכן תעשה את הדבר הבא
    בלולאה שרצה על הRS אז תשים את הדבר הבא

    countAll = countAll + rs.Fields("total_hits")

    ושורה אחרי הסיום של הלולאה (next) תעשה הוצאת פלט (response.write ) של המשתנה הזה

    Response.Write(countAll)

  39. albert הגיב:

    nirtheking
    זה בדיוק מה שעשיתי והכל "בסדר"… אבל אני רוצה שהשאילתה שלי תהיה יותר מתוחכמת ושתחשב לי את סכום ההצבעות הכליי בעצמה.. בלי לולאה….
    אפשרי?

    תודה, אלברט

  40. ניר טייב הגיב:

    שתמח במה שיש לך כי
    לדעתי השאילתא לא יכולה לעשות יותר מזה בגלל שזה מחלק לקבוצות ואתה לא יכול שלא לעבוד בלי הקבוצות אז זהו הדיון הושלם ותם

  41. זהר פלד הגיב:

    כל כך הרבה שאלות…
    נראה לי שבמקום לעזור לך רק סיבכתי אותך עוד יותר….

    לגבי סכום ההצבעות לכל תשובה, אתה צודק – אין צורך ב sum, טעות שלי.

    לגבי המשפט שלי של "בלי להשתמש ב group by", הכוונה היא ליצור שאילתה נפרדת לגמרי שמיועדת אך ורק לחישוב סך כל ההצבעות – (זו גם הכוונה ב " שיותר יעיל לשלוח שאילתה אחת למסד הנתונים מאשר שתיים" שכתבתי בהודעה הקודמת).

    לגבי count שאמרתי לך להשתמש בו, פשוט התבלבלתי בין count ל sum.

    שאילתה שתחשב את סך כל ההצבעות:

    SELECT SUM(intNumOfVotes) FROM votesTable

    כמובן ,intNumOfVotes הוא השדה ששומר בתוכו את מספר המצביעים לכל תשובה, ו VotesTable היא טבלת התוצאות של הסקר.

    בקיצור – מכל הסיבוך הזה הסתבכנו והתבלבלנו שנינו… לא נורא – זה קורה במשפחות הכי טובות…

  42. ניר טייב הגיב:

    ישאיר את ה-SUM
    כך הוא יוכל לעבור בלולאה ולחשב את הסכום הכולל

  43. albert הגיב:

    יש מצב ש:
    השרשור הזה הוא השרשור הכי ארוך בפורום?

  44. ניר טייב הגיב:

    על בטוח בתנאי..
    שנמשיך למלות בשטויות כמו אלו
    הצפה

    דבר שעשוי בהחלט בכל הפורומים (לא ממליץ)

שלח תשובה