Суммируйте столбцы из двух связанных таблиц и группируйте их по другому столбцу (postgresql) - PullRequest
0 голосов
/ 16 февраля 2020

С учетом двух таблиц:

  • учителя: ID, идентификатор школы
  • школы: ID, численность учащихся, район.

... какой запрос может подсчитать количество учителей и учащихся по районам?

выборка данных:

Teachers
ID, school_id
1, 1
2, 1
3, 2
4, 3

Schools
ID, student_population, district
1, 45, Falaba
2, 23, Falaba
3, 87, Bonth
4, 10, Moyamba

Желаемые результаты:

teachers, students, district
3, 68, Falaba
1, 87, Bonth
0, 10, Moyamba

Моя первая попытка была:

select count(*) as teachers, sum(student_population), district from teachers join schools on teachers.school_id = schools.id group by district.

... однако этот запрос приводит к тому, что численность учеников каждой школы учитывается для каждого учителя, который принадлежит к ней. Следовательно, общая численность учащихся по Фалабе составляет 113 (45 + 45 + 23) вместо 68.

1 Ответ

2 голосов
/ 16 февраля 2020

Предполагая, что в таблице teachers есть (как минимум) второй столбец, содержащий идентификатор учителя, вы можете сделать:

select
    count(distinct t.teacher_id) teachers
    sum(s.student_population) students,
    s.district
from schools s
inner join teachers t on t.school_id = s.id
group by s.district

Лучшим вариантом является предварительная агрегация teachers таблица:

select
    sum(t.teachers) teachers,
    sum(s.student_population) students,
    s.district
from schools s
inner join (select school_id, count(*) teachers from teachers group by school_id) t 
    on t.school_id = s.id
group by s.district

Демонстрация на DB Fiddle :

teachers | students | district
-------: | -------: | :-------
       1 |       87 | Bonth   
       3 |       68 | Falaba  
...