SQL запрос для базы данных найти количество студентов - PullRequest
3 голосов
/ 06 февраля 2020

Я новичок в базах данных, и у меня есть следующее: мне нужно показать курсы с наибольшим количеством неправильных учеников (тем, кто еще не принес книгу, и тем, кто принес их позже, чем date_to_return)

  1. ТАБЛИЦА КУРСЫ : код курса, имя курса.

  2. TABLE pupils_on_courses : pupil_id, code_code.

  3. TABLE учеников : pupil_id

  4. TABLE books_out_on_loan : pupil_id, isbn, date_borrowed, date_to_return_date_returned

Я пытался найти количество неточных учеников для каждого раздел, но теперь я застрял в поиске макс.

Я думаю, что ошибка в том условии, что у меня есть для подсчета date_returned & date_to_return

select 
    c.course_code, c.course_name, count (bb.pupil_id) 
from 
    courses c 
inner join 
    pupils_on_courses ps on c.course_code = ps.course_code
inner join 
    pupils p on p.pupil_id = ps.pupil_id
inner join 
    books_out_on_loan bb on p.pupil_id = bb.pupil_id
group by 
    c.course_code, c.course_name
having 
    count (bb.pupil_id) = (select max(count(*))
                           from pupil p 
                           inner join books_out_loan bb on p.pupil_id = bb.pupil_id
                           where bb.date_returned is null 
                              or bb.date_returned > date_to_return
                           group by c.course_code, c.course_name) 

Буду признателен за помощь

РЕДАКТИРОВАТЬ: Некоторые данные образца будут: enter image description here

Ответы [ 3 ]

0 голосов
/ 07 февраля 2020

Возможно, вы можете отфильтровать 'неправильное' уже в предложении WHERE.

Тогда не вернутся те, которые имеют только «правильное».
Но поскольку вам нужны только те, у которых максимальное «не правильное» значение должно быть достаточно справедливым.

И вам также может понадобиться выбрать только те, которые должны были быть возвращены до текущей даты.

SELECT c.course_code, c.course_name
, COUNT(DISTINCT bb.pupil_id) AS non_correct_pupils
FROM books_out_on_loan bb 
INNER JOIN pupils_on_courses ps 
  ON ps.pupil_id = bb.pupil_id
INNER JOIN courses c 
  ON c.course_code = ps.course_code
WHERE bb.date_to_return < CAST(current_timestamp AS DATE)
AND (bb.date_returned IS NULL OR bb.date_returned > bb.date_to_return)
GROUP BY c.course_code, c.course_name
ORDER BY COUNT(DISTINCT bb.pupil_id) DESC

DISTINCT используется для подсчета только уникальных идентификаторов pupil.

Чтобы получить самый высокий рейтинг, попробуйте это

SELECT * 
FROM
(
SELECT c.course_code, c.course_name
, COUNT(DISTINCT bb.pupil_id) AS non_correct_pupils
, DENSE_RANK() OVER (ORDER BY COUNT(DISTINCT bb.pupil_id) DESC) AS Rnk
FROM books_out_on_loan bb 
INNER JOIN pupils_on_courses ps 
  ON ps.pupil_id = bb.pupil_id
INNER JOIN courses c 
  ON c.course_code = ps.course_code
WHERE bb.date_to_return < CAST(current_timestamp AS DATE)
AND (bb.date_returned IS NULL OR bb.date_returned > bb.date_to_return)
GROUP BY c.course_code, c.course_name
)
WHERE Rnk = 1
0 голосов
/ 07 февраля 2020
select 
    c.course_code, min(c.course_name) course_name,
    count(distinct pc.pupil_id) as max_pupil_cnt
from 
    courses c inner join pupils_on_courses pc
        on ps.course_code = c.course_code
    inner join books_out_on_loan b
        on b.pupil_id = pc.pupil_id
where b.date_returned is null or b.date_returned > b.date_to_return
group by c.course_code
having count (distinct pc.pupil_id) >= all (
    select count(distinct pc2.pupil_id)
    from pupils_on_courses pc2 inner join books_out_loan b2. 
        on b2.pupil_id = pc2.pupil_id
    where b2.date_returned is null or b2.date_returned > b2.date_to_return
    group by pc2.course_code
);

Существуют современные способы сделать это без повторения логики c. Я предполагаю, что вам нужно придерживаться базовых c вещей, так как это похоже на домашнюю работу.

0 голосов
/ 07 февраля 2020

Если вы публикуете образцы данных, нам будет гораздо легче помочь.

Это может сработать для вас, если вы хотите посчитать количество студентов, а не количество непокупаемых книг или поздний возврат:

select 
    c.course_code, c.course_name, 
    count (distinct case when bb.date_returned is null or bb.date_returned > date_to_return
      then p.pupil_id else null end) as NoncorrectStudents
from 
    courses c 
inner join 
    pupils_on_courses ps on c.course_code = ps.course_code
inner join 
    pupils p on p.pupil_id = ps.pupil_id
left join 
    books_out_on_loan bb on p.pupil_id = bb.pupil_id
group by 
    c.course_code, c.course_name

Когда у вас есть это, вы сможете сортировать по количеству некорректных учеников. Пожалуйста, опубликуйте данные, когда у вас появится возможность, чтобы их можно было проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...