2012-03-04 4 views
0

사용자에게 짧은 퀴즈를 제공하는 인트라넷 웹 응용 프로그램을 개발 중입니다. 질문 : 나는 다음과 같은 데이터베이스 디자인 한 :각 부서의 비 참가자를 표시하는 방법은 무엇입니까?

직원 테이블 : DivisionID, DivisionName

퀴즈 표 : QuizID, 제목, 설명

아이디, 이름, 욥이,

부문의 표를 DivisionID

UserQuiz 테이블 : UserQuizID는, 스코어는 DateTimeComplete, QuizID, 자명

주 : 각 테이블의 첫 번째 특성은 t이며 그는 기본 키입니다.

나는 표시하는 쿼리를 마련 할 필요가 : 비 참가자의

  • 이름
  • 부문
  • 비 참가자

지금의

  • 총 수 그렇게하는 방법?

    이 쿼리는 당신에게 어떤 퀴즈에 참여하지 않은 사용자의 목록을 제공
  • 답변

    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) 
    

    업데이트로 질문에 대답하기를 설명 :

    퀴즈 및 나누기별로 비회원자를 그룹화하고 계산하려면 :

    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

    귀하의 도움에 감사 드리며 정말로 감사드립니다. 그런데 두 가지를 병합하고 위의 모든 요구 사항을 보여주는 쿼리 하나를 만들 수 있습니까? –

    +0

    COUNT (*)를 name 및 DivisionName 뒤에 열로 추가 할 수 있습니다. 그러나 그것은 반환 된 각 행에 대해 반복되는 동일한 값을 제공 할 것이므로 별도의 쿼리를 갖는 것이 더 좋을 것이라고 생각합니다. 또한 데이터를받는 코드에서 반환되는 행 수를 계산할 수 있으므로이를 결합 할 필요가 없습니다. –

    +0

    감사합니다. 각 퀴즈에 비 참가자 이름을 표시하는 방법. 제 말은 QuizID를 가져오고 싶습니다. 결과는 DivisionName과 QuizID로 그룹화해야합니다. 그렇게하는 방법? –

    관련 문제