2011-10-10 41 views
0

我一直在玩一段時間的代碼現在,我遇到了一個問題,我必須得到的平均數超過一定數量的某些領域的數量,從兩個不同的表中分組字段是否可以在聚合中使用聚合來獲得特定的單個值?

這是我的代碼和期望

SELECT C.Course,S.Name, COUNT(*) as Average FROM Students S 
INNER JOIN Student_Modules SM ON 
SM.StudentID = S.ID 
INNER JOIN Courses_Template C 
ON C.ID = SM.CourseID 
Group by C.Course,S.Name 
Having AVG(SM.Percentage_Obtained) > 80 

這會將包含課程名稱,學生姓名和百分比數量超過80%的行發回給我。

這對我來說是「通過課程的學生數量」。我想知道如何強制此查詢給我誰已經在模塊中的學生已經通過量代替通過課程的學生的數量和是否有可能

編輯1:

學生LAYOUT

CREATE TABLE Students 
      (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
      ,StudentNumber VARCHAR(20) 
      ,Name VARCHAR(40) 
      ,Surname VARCHAR(40) 
      ,Student_ID VARCHAR(13) 
      ,Languages VARCHAR(200) 
      ,[Address] Varchar (512) 
      ,Contact_Number varchar(20) 
      ,Email Varchar (150) 
      ,Days_Absent INT 
      ,Student_Web_Username varchar(40) 
      ,Student_Web_Password varchar(MAX) 
      ,BranchID int 
      ,Constraint FKStudentBranch FOREIGN KEY (BranchID) REFERENCES Branches(ID) 
      ,CONSTRAINT Unq_StudentNumber UNIQUE (StudentNumber) 
      ,CONSTRAINT Unq_Student_ID UNIQUE (Student_ID)); 

STUDENT_MODULE佈局

CREATE TABLE Student_Modules 
      (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
      ,ModuleID INT 
      ,StudentID INT 
      ,CourseID INT 
      ,Percentage_Obtained INT Check (Percentage_Obtained >= -1 AND Percentage_Obtained <= 100) 
      ,CONSTRAINT FKStudentModulesChosen FOREIGN KEY (ModuleID) REFERENCES Modules_Template(ID) ON DELETE CASCADE 
      ,CONSTRAINT FKStudentModules FOREIGN KEY (StudentID) REFERENCES Students(ID) ON DELETE CASCADE);  

COURSES_TEMPLATE佈局

CREATE TABLE COURSES_TEMPLATE 
     (ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED 
     ,Course VARCHAR(40) 
     ,Price SMALLMONEY CHECK(Price > 0) 
     ,BranchID INT 
     ,CONSTRAINT FKCourseBranches FOREIGN KEY (BranchID) REFERENCES Branches(ID) ON DELETE CASCADE); 
+0

你也可以顯示你的表格結構嗎?從你的查詢中推斷它並不是最簡單的。 – JNK

+0

我會粘貼我所能做的。雖然 – Eon

+0

我們所需要的只是與查詢相關的字段。我只看到3個表和5或6個字段列出。 – JNK

回答

0

如果他們需要跨所有模塊平均傳遞80%。

SELECT C.Course, COUNT(*) as [Average] 
FROM Students S 
INNER JOIN Student_Modules SM ON S.ID = SM.StudentID 
INNER JOIN Courses_Template C ON SM.CourseID = C.ID 
INNER JOIN (
    SELECT SM.StudentID, SM.CourseID 
    FROM Student_Modules SM 
    Group by SM.StudentID, SM.CourseID 
    Having AVG(SM.Percentage_Obtained) > 80 
) Pass ON SM.StudentID = Pass.StudentID AND SM.CourseID = Pass.CourseID 
GROUP BY C.Course 

如果他們需要的80%,通過每個模塊通過考試然後

SELECT C.Course, COUNT(*) as [Average] 
FROM Students S 
INNER JOIN Student_Modules SM ON S.ID = SM.StudentID 
INNER JOIN Courses_Template C ON SM.CourseID = C.ID 
LEFT OUTER JOIN (
    SELECT DISTINCT SM.StudentID, SM.CourseID 
    FROM Student_Modules SM 
    WHERE SM.Percentage_Obtained <= 80 
) as NotPass ON SM.StudentID = NotPass.StudentID AND SM.CourseID = NotPass.CourseID 
WHERE NotPass.StudentID IS NULL 
GROUP BY C.Course 

這是未經測試,讓我知道任何錯誤或粘貼不正確的輸出與預期輸出。

+0

雖然我對學生課程表進行了全面的重新設計,包含一個標記爲true的位,當所有與該表相關的模塊(根據學生)均高於80%時,該標記位爲true。 – Eon

0

看起來你想要通過每門課程的學生人數?如果是這樣,你只需要按C.Course進行分組,然後將Count(S.Name)作爲NumWhoPassed用於顯示?

+0

嘗試過。發回學生通過的模塊數量 – Eon

+0

這裏是一些僞造的。計數(課程,學生,計數(AVG(SM.Percentage_Obtained> 80))) – Eon

+0

因此,如果您刪除S.Name,它會爲您提供通過課程的模塊總數,而不是通過多少學生?我一定是生鏽的,因爲那不是我認爲會發生的事情。我不能想到另一種方法,從我的頭頂上去做:(對不起。 – Twomz

相關問題