Рассмотрим классические отношения «ученик и классы многие-много», когда ученик может посещать несколько классов, а класс состоит из нескольких учеников.
CREATE TABLE students(
id serial PRIMARY KEY,
name text,
gender text NOT NULL
);
CREATE TABLE schools(
id serial PRIMARY KEY,
name text,
);
CREATE TABLE classes(
id serial PRIMARY KEY,
name text,
school_id integer NOT NULL REFERENCES schools (id)
);
CREATE TABLE students_classes(
id serial PRIMARY KEY,
class_id integer NOT NULL REFERENCES classes (id),
student_id integer NOT NULL REFERENCES students (id),
);
Общий запрос намного больше - учтите, что есть школы и другие вещи, которые усложняют проблему. Поэтому мне нужно использовать оконные функции, чтобы получить такие вещи, как total_students
.
Мне нужен запрос, в котором будут указаны все классы, общее количество студентов, зачисленных в этот класс, количество зачисленных парней и количество девочек.
class_id | n_students | n_guys | n_girls
____________________________________________
| | |
Пока у меня есть следующее, могу ли я получить какую-то помощь по количеству парней и девушек?
SELECT
school_id,
w.class_id,
w.n_students,
w.n_guys,
w.n_girls
FROM schools
JOIN classes ON classes.school_id = schools.id
JOIN (
c.id AS class_id,
COUNT(*) OVER (PARTITION BY sc.class_id) AS n_students,
{Something} AS n_guys,
{Something} AS n_girls
FROM students_classes AS sc
JOIN classes AS c ON sc.class_id = c.id
) as w ON w.class_id = classes.id
WHERE school_id = 81;