Хотелось бы что-то вроде:
WITH att
AS (SELECT studentID,
SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count
FROM attendance
GROUP BY studentID)
SELECT *
FROM Attendance a
INNER JOIN Student s USING (studentID)
INNER JOIN att USING (studentID)
WHERE att.att_count < 5
AND a.unitcode = 'SIT103';
работаешь на тебя?
Вы можете выбрать нужные вам столбцы из СТУДЕНТА, ВНИМАНИЯ и т. Д.
РЕДАКТИРОВАТЬ: у меня нет интерфейса SQL передо мной, поэтому некоторые из SQL может потребоваться настройка.
Дэвид, в свете новой информации, попробуйте следующее:
WITH att
AS (SELECT unitcode,
studentID,
SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count
FROM attendance
WHERE attdate < TO_DATE('07/08/2011', 'DD/MM/YYYY')
GROUP BY unitcode,
studentID)
SELECT *
FROM Student s
INNER JOIN att USING (studentID)
WHERE att.unitcode = 'SIT103'
AND att.att_count < 5;
У меня теперь работает SQL * Plus. Я только что побежал:
CREATE TABLE student (
studentid NUMBER,
student_name VARCHAR2(30)
);
CREATE TABLE attendance (
studentid NUMBER,
unitcode VARCHAR2(10),
attdate DATE,
attstatus VARCHAR2(5)
);
INSERT INTO student VALUES (2106,'Jo Bloggs');
INSERT INTO student VALUES (2108,'Jo Schmoe');
INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('05/06/2011', 'DD/MM/YYYY'), 'No');
INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('07/07/2011', 'DD/MM/YYYY'), 'Yes');
INSERT INTO attendance VALUES (2106, 'SIT103', TO_DATE('10/05/2011', 'DD/MM/YYYY'), 'Yes');
INSERT INTO attendance VALUES (2108, 'SIT203', TO_DATE('05/05/2011', 'DD/MM/YYYY'), 'Yes');
WITH att
AS (SELECT unitcode,
studentID,
SUM(CASE WHEN attStatus = 'Yes' THEN 1 ELSE 0 END) as att_count
FROM attendance
WHERE attdate < TO_DATE('07/08/2011', 'DD/MM/YYYY')
GROUP BY unitcode,
studentID)
SELECT studentid,
student_name,
unitcode
FROM Student s
INNER JOIN att USING (studentID)
WHERE att.unitcode = 'SIT103'
AND att.att_count < 5;
и получил:
STUDENTID STUDENT_NAME UNITCODE
2106 Jo Schmoe SIT103
Что правильно, не так ли?