2012-03-04 25 views
0

我正在開發一個Intranet Web應用程序,爲用戶提供簡短的測驗。 的問題是:我有以下的數據庫設計:如何顯示每個部門的非參與者?

Employee表:用戶名,姓名,工作,DivisionID

司表:DivisionID,DivisionName

測驗表:QuizID,標題,描述

UserQuiz表:UserQuizID,得分,DateTimeComplete,QuizID,用戶名

注:在每個表中的第一個屬性是叔他是主鍵。

我需要拿出一個查詢,顯示:

  • 非參與者的姓名
  • 非參加

所以總數怎麼做?

回答

2

此查詢賦予您還沒有參加過任何測驗用戶的列表:

SELECT Name, DivisionName FROM Employee AS E 
LEFT OUTER JOIN Division AS D ON E.DivisionID = D.DivisionID 
WHERE Username NOT IN (SELECT Username FROM UserQuiz) 

這給你不參加的人數:

SELECT COUNT(*) FROM Employee 
WHERE Username NOT IN (SELECT Username FROM UserQuiz) 

更新,以回答問題評論:

要對每個測驗和分區的非paratipants進行分組和計數:

SELECT Q.QuizId, D.DivisionName, E.Name FROM Quiz AS Q 
CROSS JOIN Employee AS E 
LEFT OUTER JOIN Division AS D ON E.DivisionID = D.DivisionID 
WHERE NOT EXISTS (SELECT * FROM UserQuiz AS UQ 
    WHERE UQ.Username = E.Username AND UQ.QuizID = Q.QuizID) 
ORDER BY Q.QuizId, D.DivisionName 
+0

感謝您的幫助,我非常感謝。順便說一句,我可以合併他們兩個,並有一個查詢,顯示所有上述要求? – 2012-03-04 07:06:40

+0

您可以在名稱和分區名稱後添加COUNT(*)作爲列。但是,這會給你在每一行返回的值重複相同的值,所以我認爲有一個單獨的查詢會更好。您也可以在接收數據的代碼中計算返回的行數,因此不需要組合它們。 – 2012-03-04 07:20:00

+0

謝謝。但是如何在每個測驗中顯示非參與者名稱。我的意思是,我想要檢索QuizID。結果應按DivisionName和QuizID分組。怎麼做? – 2012-03-04 07:34:57

相關問題