2017-05-09 32 views
0

我有以下數據庫:運動對羣體

Prof(profBadge, profName, Department) Course(courseCod, courseName, profBadge, area) Class(classCode, date, courseCod, numberOfStudents)

並提出以下要求: 對於誰只在該地區的數據庫課程顯示工號和課程其中最高平均每位教授學生的。

Create view badgeList(profBadge, courseCod) as 
SELECT DISTINCT profBadge, courseCod 
FROM Coure 
WHERE (profBadge NOT IN (SELECT profBadge 
        FROM Course 
        WHERE Area <> 'database')); 

Create view avgLessons(AvgStud, courseCod) as 
SELECT AVG(numberOfStudents), courseCod 
FROM class 
GROUP BY courseCod; 

Create view MaxStudent(maxStu, profBadge) as 
select max(med.avgStud), el.profBadge 
from avgLessons med, badgeList el 
where med.courseCod= el.courseCod 
group by el.profBadge; 

select DISTINCT MS.profBadge, MS.MAXSTU, Corso.CODCORSO 
from MaxStudent MS, course, class 
where MS.profBadge = course.profBadge and MS.maxStu = class.numberOfStudents and course.courseCod = class.courseCod;` 
+3

將其分解成部分。首先,你如何找到平均學生人數最多的課程?那麼你如何加入到數據集並顯示「數據庫」課程的徽章和課程編號? – xQbert

+0

但是,如果我找到最高編號的課程,我會失去其他課程的信息,或者不是?我需要爲每位教授 –

+1

找到平均學生人數最多的課程,因此在該計算中包含一組在profbadge上的小組。並使用徽章和課程加入。我試圖避免的是爲你寫答案,而是引導你嘗試自己嘗試解決問題的方法。那老人教導人們爲了生活而吃魚,讓他們吃一天他們吃的魚。不要吃整個大象,每次只吃一口,看看它是如何結合在一起的。分解爲組成部分的複雜事物變得簡單,當您將組件重新放回時,它不再複雜。 – xQbert

回答

0

我不知道如果我看到你想達到什麼樣的,但下面的代碼返回profBadges只有那些courseNames其中有學生(通過屬於類的數量計算)的最高平均數量。

SELECT profBadge, 
    courseName 
FROM 
    (SELECT C.profBadge, 
    C.courseName, 
    SUM(CL.numberOfStudents)              /COUNT(CL.classCode) AS Avg_Students_Num, 
    ROW_NUMBER() OVER (PARTITION BY C.profBadge ORDER BY SUM(CL.numberOfStudents)/COUNT(CL.classCode)) AS Rank 
    FROM Course C 
    LEFT JOIN Class CL 
    ON CL.courseCod=C.courseCod 
    GROUP BY C.courseName, 
    C.profBadge 
) 
WHERE Rank=1 
+0

只處理只有'數據庫'區域的教授。 – xQbert

0

這並非易事。如前所述,請一步一步來做。

第1步:只有區域'數據庫'的課程的教授。正如你所做的那樣使用NOT IN是解決這個問題的一種方法。另一個(通常最快)是聚合。

SELECT profBadge 
FROM Course 
GROUP BY profBadge 
HAVING MIN(Area) = 'database' AND MAX(Area) = 'database'; 

第2步:每個課程的平均學生人數,如你所展示的。

SELECT courseCod, AVG(numberOfStudents) 
FROM class 
GROUP BY courseCod; 

第3步:將兩者結合。您可以選擇profBadge位於第一組(第1步中的查詢)的課程,並按平均學生人數(您必須加入第2步中的查詢)對其排名。

SELECT courseCod, courseName, profBadge, area 
FROM 
(
    SELECT 
    c.courseCod, c.courseName, c.profBadge, c.area, 
    RANK() OVER (PARTION BY c.profBadge ORDER BY av.avgNum DESC) AS rn 
    FROM Course c 
    JOIN 
    (
    SELECT courseCod, AVG(numberOfStudents) AS avgNum 
    FROM class 
    GROUP BY courseCod 
) av ON av.courseCod = c.courseCod 
    WHERE c.profBadge IN 
    (
    SELECT profBadge 
    FROM Course 
    GROUP BY profBadge 
    HAVING MIN(Area) = 'database' AND MAX(Area) = 'database' 
) 
) 
WHERE rn = 1;