/ / Tough Sql Server Join Query - sql-server, sql-server-2008, reporting-services

Twardy serwer SQL dołącz do zapytania - sql-server, sql-server-2008, reporting-services

Buduję aplikację na mój semestralny egzamin, który odbędzie się za 20 dni. Moja aplikacja powinna pomagać nauczycielom w łatwiejszym budowaniu harmonogramu zajęć.

Pracuję z podejściem do bazy danych (Sql Server 2008 i Delphi XE2). Mam kilka tabel opisujących strukturę formacji studenckich. Więc mam Years, Series, Specializations, Groups i SemiGroups. Jak na obrazku Years zawiera Series, Series zawierać Specializations, Specializations zawiera Groups i Groups może zawierać lub nie SemiGroups. Mam też stoły z Courses, Teachers, ClassRooms, Days i HourlyIntervals.

Jest kilka warunków:

  1. Nauczyciel może wziąć udział w kursie z jedną lub większą liczbą specjalizacji, LUB z jedną lub większą liczbą grup, LUB z jedną lub większą liczbą półgrup.

  2. Drugim warunkiem jest to, że kursy są 3 typów: TeachingCourse, Seminary, Laboratory (tylko dwa z trzech możliwych dla każdego CourseName). (Przechowywane w kolumnie Scheduler.CourseType char (3))

  3. Trzeci: Kursy mogą być prowadzone we wszystkich tygodniach semestru lub w liczbach nieparzystych lub w tygodniach podzielnych przez 2. (przechowywane w kolumnie Scheduler. Week char (3))

Zapisuję więc korelacje w tabeli SchedulerTable.

wprowadź opis obrazu tutaj

Jeśli więc grupa ma kurs z pewnym nauczycielem, przedstawię tylko odpowiednie identyfikatory.

Zbudowałem prawie wszystkie dane wprowadzające formularze iteraz jestem w części aplikacji Raportowanie. Korzystam z usług Report Services z MSSQL 2008. Chcę wymienić harmonogram, który będzie zawierał wszystkie korelacje dla określonej specjalizacji (która obejmuje grupy i / lub półgrupy). Udało mi się pokazać wszystkie korelacje dla grup należących do tych określonych specjalizacji, ale nie jestem w stanie pokazać innych kursów specjalizacyjnych i półgrup.

To zapytanie zwraca mi korelacje grup z określonej specjalizacji.

SELECT    Days.DayName, HourlyIntervals.HourlyIntervalName, Scheduler.Week, Scheduler.CourseType,  Courses.CourseName, ClassRooms.ClassRoomName, Teachers.TeacherName,Specializations.SpecName, Groups.GroupsName
FROM   Scheduler INNER JOIN
Groups ON Scheduler.GroupID = Groups.GroupID INNER JOIN
Days ON Scheduler.DayID = Days.DayID INNER JOIN
HourlyIntervals ON Scheduler.HourlyIntervalID = HourlyIntervals.HourlyIntervalID INNER JOIN
Teachers ON Scheduler.TeacherID = Teachers.TeacherID INNER JOIN
Courses ON Scheduler.CourseID = Courses.CourseID INNER JOIN
ClassRooms ON Scheduler.ClassRoomID = ClassRooms.ClassRoomID INNER JOIN
Specializations ON Groups.IDSpec = Specializations.IDSpec

WHERE  (Specializations.ID = @SpecID)

ORDER BY Days.DayID, HourlyIntervals.HourlyIntervalID

Ale chcę, żeby zwrócił korelacjePółgrupy, grupy i specjalizacja dla tej specjalizacji. Próbowałem dodać złączenie za pomocą tego Scheduler.SemiGroupID = Semigroups.SemigroupID, ale zapytanie zwraca 0 wyników. Nie wiem, czy da się to zrobić, co chcę, ale będę wdzięczny każdemu, kto zasugeruje mi pomysł. Czy powinienem użyć innej struktury do tabeli korelacji (SchedulerTable).

To jest przykładowy raport (plik PDF), który chciałbym uzyskać:

Edytuj powód: Lepsze wyjaśnienie problemu

Odpowiedzi:

0 dla odpowiedzi № 1

Dlaczego więc nie jest to rozwiązanie?

SELECT    Days.DayName, HourlyIntervals.HourlyIntervalName, Scheduler.Week, Scheduler.CourseType,  Courses.CourseName, ClassRooms.ClassRoomName, Teachers.TeacherName,Specializations.SpecName, SemiGroups.GroupsName
FROM   Scheduler
INNER JOIN SemiGroups On Scheduler.SemiGroupId = SemiGroups.SemiGroupId
INNER JOIN Groups ON SemiGroups.GroupID = SemiGroups.Groups
INNER JOIN Days ON Scheduler.DayID = Days.DayID
INNER JOIN HourlyIntervals ON Scheduler.HourlyIntervalID = HourlyIntervals.HourlyIntervalID
INNER JOIN Teachers ON Scheduler.TeacherID = Teachers.TeacherID
INNER JOIN Courses ON Scheduler.CourseID = Courses.CourseID
INNER JOIN ClassRooms ON Scheduler.ClassRoomID = ClassRooms.ClassRoomID
INNER JOIN Specializations ON Groups.IDSpec = Specializations.IDSpec

WHERE  (Specializations.ID = @SpecID)
ORDER BY Days.DayID, HourlyIntervals.HourlyIntervalID

Chociaż przyznam się do zmarszczonego czoła, czy GroupID w Schedules był GroupID dla SemiGroupID w tym wierszu. Wygląda na to, że ten bit nie jest znormalizowany.