2013-11-24 19 views
0

我工作的一門功課的問題,其中構建SQL查詢與多個WHERE要求,一個有點複雜,失去了

我需要輪詢三個表並找出誰擁有 小於3.5 GPA學生的名字並正在採取不到9學分

我已經想出瞭如何填充少於9學分的學生的名字,但我堅持計算出他們的學分。

學生表包含Student ID(主鍵),NameYear(新鮮,SOPH等),Major,和GPA

表包含course ID(主鍵),Name of classcredit hour rating for that class

招生表包含Student ID(使這個外鍵),Course1(FK),Course2Course3Course4

我不是在尋找'正確'的答案,而是一些方向感。

我的查詢到目前爲止

SELECT DISTINCT NAME 
From StudentTable,EnrollmentTable,CourseTable 
WHERE (GPA <3.5) 

我想我需要的東西,GPA檢查後,分析EnrollmentTable爲每一位學生,檢查每個課程(Course1,Course2等),如果NULL! ,使用該courseID並輪詢課程表以查找該課程的學分值。然後使用SUM檢查以查看是否< 9.

想法?感謝您的幫助!

回答

2

,你需要獲得的學分總和對於一個給定的學生,這將導致您

讓我們打破它考慮一組。首先,你需要< 3的學生。5 GPA,這是簡單的只是:

SELECT S.Id, S.Name 
FROM Student S 
WHERE S.GPA < 3.5 

它做了一個有點棘手,通過使每個學生在入學的招生多列,而不是多個行(這是比較正常的)

就個人而言,我想將其轉換成一個 '規範化' 的觀點:

SELECT StudentId, Course1 AS CourseId 
FROM Enrollment E 
UNION 
SELECT StudentId, Course2 AS CourseId 
FROM Enrollment E 
UNION 
SELECT StudentId, Course3 AS CourseId 
FROM Enrollment E 
UNION 
SELECT StudentId, Course4 AS CourseId 
FROM Enrollment E 

再加上第一查詢:

SELECT S.Id, S.Name 
FROM Student S 
JOIN 
(
    SELECT StudentId, Course1 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course2 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course3 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course4 AS CourseId 
    FROM Enrollment E 
) E 
    ON E.StudentId = S.StudentId 
WHERE S.GPA < 3.5 

然後,你需要實際的課程,以獲得CreditHourRating:

SELECT S.Id, S.Name, C.CreditHourRating 
FROM Student S 
JOIN 
(
    SELECT StudentId, Course1 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course2 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course3 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course4 AS CourseId 
    FROM Enrollment E 
) E 
    ON E.StudentId = S.StudentId 
JOIN Course C 
    ON E.CourseId = C.CourseId 
WHERE S.GPA < 3.5 

然後你只需要合計爲每一位學生,因此該查詢:

SELECT S.Id, S.Name, SUM(C.CreditHourRating) 
FROM Student S 
JOIN 
(
    SELECT StudentId, Course1 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course2 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course3 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course4 AS CourseId 
    FROM Enrollment E 
) E 
    ON E.StudentId = S.StudentId 
JOIN Course C 
    ON E.CourseId = C.CourseId 
WHERE S.GPA < 3.5 
GROUP BY S.Id, S.Name 

最後,你就具備的條件信用小時收費:

SELECT S.Id, S.Name, SUM(C.CreditHourRating) 
FROM Student S 
JOIN 
(
    SELECT StudentId, Course1 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course2 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course3 AS CourseId 
    FROM Enrollment E 
    UNION 
    SELECT StudentId, Course4 AS CourseId 
    FROM Enrollment E 
) E 
    ON E.StudentId = S.StudentId 
JOIN Course C 
    ON E.CourseId = C.CourseId 
WHERE S.GPA < 3.5 
GROUP BY S.Id, S.Name 
HAVING SUM(C.CreditHourRating) < 9 
+0

+1對結果集進行篩選,以獲得詳細的答案和解釋。 –

+0

感謝您將它分解成像Fergus !!!!!完美的工作,我現在完全理解實施。再次感謝! – user3029300

2

如果數據庫模式取決於你,那麼我會改變它一點。招生代表學生和課程之間的映射。我將它簡化爲兩列:StudentID和CourseID(如果您不希望表的組合主鍵,則可以添加EnrollmentID的第三列)。

完成後,您可以加入Students - > Enrollments - > Courses。按StudentID分組,並使用HAVING子句對學生的學分和學生GPA中的WHERE進行篩選。

有意義嗎?

+0

有趣,但不幸的是桌子給了我們。我從來沒有聽說過HAVING條款,所以我現在正在研究這個問題。 – user3029300

+0

在這種情況下,請查看「註冊」和「課程」之間的「左連接」,然後對每個「註冊」 - >「課程關係」的ISNULL(Course.CreditHour,0)進行求和。您最終會得到四個代表每個註冊 - >課程關係的左連接。此外,HAVING子句用於根據集合函數(http://technet.microsoft.com/en-us/library/ms180199.aspx) –