Соответствующие таблицы базы данных объявлены следующим образом:
students (student_id (PK), full_name, semester, ...)
subjects (subject_code (PK), subject_title, semester)
teacher_attendance (class_id (PK), subject_code(FK), teacher_id(FK), date)
student_attendance (class_id (FK), student_id (FK))
Пример данных:
студенты:
student_id - mca1701
.
.
.
<a lot of irrelevant fields>
.
semester - 3
предметов:
subject_code subject_title semester
CS006 Subject6 2
CS007 Subject7 3
CS008 Subject8 3
CS009P Subject9 Practical 3
CS009T Subject9 Theory 3
student_attendance:
class_no student_id
1 mca1801
1 mca1802
1 mca1805
2 *mca1701*
2 mca1702
3 *mca1701*
2 mca1704
3 mca1705
4 mca1601
4 mca1602
6 mca1803
6 mca1804
7 *mca1701*
teacher_attendance:
class_no subject_code teacher_id date
1 CS001 mca01 2019-01-14
2 CS009P mca01 2019-01-09
3 CS009P mca01 2019-01-09
4 CS013 mca01 2019-01-17
5 CS002 mca02 2019-01-02
6 CS002 mca02 2019-01-10
7 CS009T mca02 2019-01-16
8 CS014 mca02 2019-01-29
9 CS014 mca02 2019-01-29
10 CS008 mca05 2019-01-14
11 CS003P mca03 2019-01-15
12 CS015P mca03 2019-01-15
13 CS009T mca02 2019-01-15
Таблица посещаемости учителя присваивает unique numeric id
каждому классу.
В таблице посещаемости записываются идентификаторы учеников, присутствующих в этом классе.
Я хочу отобразить следующее в одном запросе для определенного ввода student_id
:
subject_code, subject_title, classes_attended, total_classes, % attendance
С этим запросом:
SELECT subject_code, subject_title, count(class_no) as attended
FROM
student_attendance
INNER JOIN teacher_attendance USING (class_no)
INNER JOIN subjects USING (subject_code)
WHERE
student_id='mca1701'
GROUP BY
subject_code
Я могу получить subject_code, subject_title, classes_attended
:
Пример операции:
subject_code subject_title attended
CS009P Subject 9 prac 2
CS009T Subject 9 theory 1
И из этого запроса я могу получить total_classes:
select subject_code,subject_title,count(class_no) as total_classes
from teacher_attendance
INNER JOIN subjects USING (subject_code)
WHERE semester= (SELECT semester from students where student_id='mca1701')
GROUP BY subject_code
Пример операции:
subject_code subject_title total_classes
CS008 Subject8 1
CS009P Subject9 Practical 2
CS009T Subject9 Theory 2
Я хочу получить следующие данные в одном запросе:
Требуемый вывод:
subject_code subject_title attended total %att
CS009P Subject 9 prac 2 2 100%
CS009T Subject 9 theory 1 2 50%
CS007 Subject7 0 0 0
CS008 Subject8 0 1 0
UPDATE:
Получил ответ благодаря Джоаким Даниэльсон. Только изменил второй JOIN TO LEFT JOIN в его ответе, который показывает пустые строки как ноль, что достаточно хорошо.
Решение:
SELECT u.subject_code, u.subject_title,t_count,s_count
FROM subjects u
JOIN students ON students.semester=u.semester
AND students.student_id='mca1701'
LEFT JOIN (SELECT subject_code, COUNT(*) t_count
FROM teacher_attendance GROUP BY subject_code) tc
ON tc.subject_code = u.subject_code
LEFT JOIN (SELECT COUNT(*) s_count,subject_code
FROM student_attendance INNER JOIN teacher_attendance
USING (class_no) WHERE student_id='mca1701'
GROUP BY subject_code) sc
ON sc.subject_code = u.subject_code
GROUP BY u.subject_code, u.subject_title
Если кто-нибудь может упростить этот запрос, я буду благодарен.