SleepingDog
New member
בעיית sql מורכב
אולי הבעייה הבאה נשמעת מוזר אבל אני דווקא צריך את הפתרון שלה לצורך בדיקה לניסוי מסויים. פישטתי את הבעייה לטבלאות פשוטות של בי"ס ושמות לצורך המחשת הבעייה. מה יש לי ? טבלת ב"יס [School]: schoolId - מפתח ראשי SchoolName - שם הבי"ס TypeId - סוג הבי"ס, 1 - תיכון, 2 - חטיבה, 3 - יסודי. וטבלת שמות - [Names]: SchoolId - הבי"ס אליו משוייך המורה. NameId - מפתח ראשי. FirstName - שם פרטי - אפשר להתעלם. LastName - שם משפחה - חשובה לנו האות הראשונה שלו. הנחת יסוד ששם לא חוזר פעמיים אך לא משמעותי. בהתחלה הייתי צריך טבלה שמראה לי לכל אות בא"ב שיש בה שמות משפחה את כמות המורים לפי סוג הבי"ס כלומר שדה אות שדה תיכון המראה את הסה"כ של מורים באות הזאת בבי"ס תיכון, שדה חטיבה המראה את בה"כ המורים בחטיבות באות הזאת... וכן הלאה. לצורך זה בניתי שאילתת עזר מהצורה הבאה ונתתי לה את השם Letters1: SELECT Left(LastName,1) AS Letter, Names.SchoolID FROM Names GROUP BY Left(LastName,1), Names.SchoolID HAVING (((Count(Answers.AnswerID))>0)); והשאילתא העיקרית: SELECT Letters1.Letter, Sum(IIf([TypeId]=1,1,0)) AS Type1, Sum(IIf([TypeId]=2,1,0)) AS Type2, Sum(IIf([TypeId]=3,1,0)) AS Type3 FROM Schools INNER JOIN Letters1 ON Schools.SchoolID = Letters1.SchoolID GROUP BY Letters1.Letter; עכשיו אני צריך לדעת דבר מסובך הרבה יותר, שאילתה המחזירה את כל צמדי האותיות X וY כאותיות ראשונות של שם משפחה, כלשהם אבל ספיציפיים כלומר לגבי כל הצרופים האפשריים, אשר מקיימים כלומר יש להם: לפחות בי"ס אחד מסוג 1 (תיכון) אשר יש בו שמות המתחילים גם בX וגם בY לפחות 3 בי"ס מסוג 2 (חטיבה) אשר יש בו שמות המתחילים גם בX וגם בY לפחות 6 בי"ס מסוג 3 (יסודי) אשר יש בו שמות המתחילים גם בX וגם בY לפחות עוד בי"ס אחד מסוג 1 אשר יש בו שמות המתחילים בX לפחות עוד 3 בי"ס מסוג 2 אשר יש בו שמות המתחילים בX לפחות עוד 6 בי"ס מסוג3 אשר יש בו שמות המתחילים בX אפשרות שחשבתי עליה בתור הטבלה הסופית תכיל את השדות LetterX,LetterY - ברור Type1XnotY - סה"כ של בי"ס בדומה לשאילתה הקודמת שעשיתי sum(iif)... Type2XnotY - כנ"ל מציג את סה"כ בהי"ס שיש לבם שמות רק באות הראשונה ולא בשנייה מסוג חטיבה Type3XnotY - כנ"ל Type1XandY - זה עונה על התנאי הראשון אם גדול או שווה ל 1 Type2XandY - זה עונה על התנאי שני אם גדול או שווהל 2 Type3XandY - ....כנ"ל את התנאי 4 אפשר יהיה לבדוק אם סכום הערכים בשדה הראשון ובשדה הרביעי יהיה גדול שוה ל 2 את התנאים 5 אפשר יהיה לבדוק אם סכום הערכים בשדה השני ובשדה החמישי יהיה גדול שוה ל 6 וכן הלאה. יש למישהו רעיון האם זה הכיוון , אם כן איך ליישם אותו ואם לא אז מה הכיוון?
אולי הבעייה הבאה נשמעת מוזר אבל אני דווקא צריך את הפתרון שלה לצורך בדיקה לניסוי מסויים. פישטתי את הבעייה לטבלאות פשוטות של בי"ס ושמות לצורך המחשת הבעייה. מה יש לי ? טבלת ב"יס [School]: schoolId - מפתח ראשי SchoolName - שם הבי"ס TypeId - סוג הבי"ס, 1 - תיכון, 2 - חטיבה, 3 - יסודי. וטבלת שמות - [Names]: SchoolId - הבי"ס אליו משוייך המורה. NameId - מפתח ראשי. FirstName - שם פרטי - אפשר להתעלם. LastName - שם משפחה - חשובה לנו האות הראשונה שלו. הנחת יסוד ששם לא חוזר פעמיים אך לא משמעותי. בהתחלה הייתי צריך טבלה שמראה לי לכל אות בא"ב שיש בה שמות משפחה את כמות המורים לפי סוג הבי"ס כלומר שדה אות שדה תיכון המראה את הסה"כ של מורים באות הזאת בבי"ס תיכון, שדה חטיבה המראה את בה"כ המורים בחטיבות באות הזאת... וכן הלאה. לצורך זה בניתי שאילתת עזר מהצורה הבאה ונתתי לה את השם Letters1: SELECT Left(LastName,1) AS Letter, Names.SchoolID FROM Names GROUP BY Left(LastName,1), Names.SchoolID HAVING (((Count(Answers.AnswerID))>0)); והשאילתא העיקרית: SELECT Letters1.Letter, Sum(IIf([TypeId]=1,1,0)) AS Type1, Sum(IIf([TypeId]=2,1,0)) AS Type2, Sum(IIf([TypeId]=3,1,0)) AS Type3 FROM Schools INNER JOIN Letters1 ON Schools.SchoolID = Letters1.SchoolID GROUP BY Letters1.Letter; עכשיו אני צריך לדעת דבר מסובך הרבה יותר, שאילתה המחזירה את כל צמדי האותיות X וY כאותיות ראשונות של שם משפחה, כלשהם אבל ספיציפיים כלומר לגבי כל הצרופים האפשריים, אשר מקיימים כלומר יש להם: לפחות בי"ס אחד מסוג 1 (תיכון) אשר יש בו שמות המתחילים גם בX וגם בY לפחות 3 בי"ס מסוג 2 (חטיבה) אשר יש בו שמות המתחילים גם בX וגם בY לפחות 6 בי"ס מסוג 3 (יסודי) אשר יש בו שמות המתחילים גם בX וגם בY לפחות עוד בי"ס אחד מסוג 1 אשר יש בו שמות המתחילים בX לפחות עוד 3 בי"ס מסוג 2 אשר יש בו שמות המתחילים בX לפחות עוד 6 בי"ס מסוג3 אשר יש בו שמות המתחילים בX אפשרות שחשבתי עליה בתור הטבלה הסופית תכיל את השדות LetterX,LetterY - ברור Type1XnotY - סה"כ של בי"ס בדומה לשאילתה הקודמת שעשיתי sum(iif)... Type2XnotY - כנ"ל מציג את סה"כ בהי"ס שיש לבם שמות רק באות הראשונה ולא בשנייה מסוג חטיבה Type3XnotY - כנ"ל Type1XandY - זה עונה על התנאי הראשון אם גדול או שווה ל 1 Type2XandY - זה עונה על התנאי שני אם גדול או שווהל 2 Type3XandY - ....כנ"ל את התנאי 4 אפשר יהיה לבדוק אם סכום הערכים בשדה הראשון ובשדה הרביעי יהיה גדול שוה ל 2 את התנאים 5 אפשר יהיה לבדוק אם סכום הערכים בשדה השני ובשדה החמישי יהיה גדול שוה ל 6 וכן הלאה. יש למישהו רעיון האם זה הכיוון , אם כן איך ליישם אותו ואם לא אז מה הכיוון?