2015-01-05 3 views
-1

Список число студентов, обучающихся по каждому коду модуля:SQL Оператор 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

Вы должны присоединиться к таблице модуля к столу Приемной и группы по ModCode

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

Как сказал Дэвид в своем ответе, вы можете использовать левое соединение (если вы хотите перечислить модули с нулевой регистрацией). – Dijkgraaf

1

Я предполагаю, что вы хотите считать модули, в которых не было студентов зачислены?

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 выше, так что модули, в которых не зачисленные студенты не будут по-прежнему учитываться. Если вы не хотите считать эти модули, используйте INNER JOIN вместо LEFT JOIN (или просто запросите таблицу Enrollment!).

Смежные вопросы