2015-01-05 3 views
-1
학생의 수는 각 모듈의 코드를 등록

목록 :SQL SELECT 문

가 내가이 쿼리에 문제가 있어요

가, 내가 무엇을 찾고 있어요 것은 예를 들어 select 문입니다

select count(studID) from student where ModCode = 'C102' 

의도 한 출력은 모듈 이름과이 모듈과 관련된 학생 수를 나타냅니다. 가능한 한 모든 모듈을 한 번에 출력에 포함하고자합니다.

구조 :

CREATE TABLE Student 
(StudID  INTEGER  PRIMARY KEY, 
StudFName VARCHAR(10) NOT NULL, 
StudLName VARCHAR(10) NOT NULL, 
DoB   DATE   NOT NULL, 
Sex   CHAR(1)  NOT NULL CHECK (Sex IN ('M', 'F')), 
Email  VARCHAR(30) UNIQUE); 

CREATE TABLE Module 
(ModCode  CHAR(4)  PRIMARY KEY, 
ModName  VARCHAR(25) NOT NULL, 
ModCredits INTEGER  NOT NULL CHECK (ModCredits IN (15, 30, 45, 60)), 
ModLevel  CHAR(3)  NOT NULL CHECK (ModLevel IN ('UG1', 'UG2', 'UG3', 'MSc')), 
ModLeader INTEGER  NOT NULL, 
Foreign Key (ModLeader) REFERENCES Staff (StaffID)); 

INSERT INTO Module VALUES ('C102', 'Java Fundamentals',   15, 'UG1', 108); 
INSERT INTO Module VALUES ('C104', 'Oracle Fundamentals',  15, 'UG1', 100); 
INSERT INTO Module VALUES ('E109', 'RF Circuit Design',   30, 'UG1', 102); 
INSERT INTO Module VALUES ('E203', 'Side-Scan Sonar',   15, 'UG2', 104); 
INSERT INTO Module VALUES ('C201', 'Database Applications',  15, 'UG2', 100); 
INSERT INTO Module VALUES ('R209', 'Artificial Intelligence 1', 30, 'UG2', 105); 
INSERT INTO Module VALUES ('C212', 'Advanced Java Apps',  15, 'UG2', 108); 
INSERT INTO Module VALUES ('N205', 'Cisco Switches',   15, 'UG2', 109); 
INSERT INTO Module VALUES ('C303', 'Database Administration', 30, 'UG3', 100); 
INSERT INTO Module VALUES ('R310', 'Autonomous Botnets',  30, 'UG3', 106); 

CREATE TABLE Enrolment 
(ModCode  CHAR(4)  NOT NULL, 
StudID  INTEGER  NOT NULL, 
StartDate DATE   NOT NULL, 
PRIMARY KEY (ModCode, StudID), 
Foreign Key (StudID) REFERENCES Student (StudID),   
Foreign Key (ModCode) REFERENCES Module (ModCode)); 
+1

어떤 학생이 어떤 모듈에 속하는지 정의하는 참조 표가 있습니까? 게시 한 표에서 어떤 학생이 특정 모듈에 속하는지 결정할 방법이없는 것 같습니다. –

+0

모듈 테이블에 입력 된 데이터가 추가되었습니다. – James

+0

어떤 쿼리에 문제가 있습니까? 또한 @mtinsley는 좋은 질문을 던졌습니다. 대답을 제공해주십시오. –

답변

0

당신은 당신이 모듈을 계산하려는 있으리라 믿고있어

SELECT M.ModCode, count(studID) as NoEnrolled 
FROM Module M 
INNER JOIN Enrolment E ON E.ModCode = M.ModCode 
GROUP BY M.ModCode 
+0

David가 대답에 언급했듯이 왼쪽 결합을 원할 수 있습니다 (등록이없는 모듈을 나열하려는 경우). – Dijkgraaf

1

MODCODE에 의해 등록 테이블 그룹에 모듈 테이블에 가입해야하는 어떤 학생들 없다 등록 된가요?

SELECT m.ModCode, COUNT(e.StudID) AS enrollment_cnt 
    FROM Module m LEFT JOIN Enrollment e 
    ON m.ModCode = e.ModCode 
GROUP BY m.ModCode 

나는 어떤 학생들이 등록되어 있지 않은 모듈이 여전히 계산 될 수 있도록 위의 LEFT JOIN를 사용합니다. 해당 모듈을 계산하지 않으려면 LEFT JOIN 대신 INNER JOIN을 사용하십시오 (또는 간단히 Enrollment 테이블을 쿼리하십시오!).