Выполнение некоторых арифметических операций внутри запроса MySQL над подмножеством записей - PullRequest
0 голосов
/ 21 мая 2019

У меня есть таблица MySQL, содержащая записи о посещаемости.Соответствующие столбцы идентифицируют участников, сеансы и статус посещаемости (подтверждено / отклонено / нет ответа).У меня также есть вторая таблица, содержащая личную информацию участников, включая дату, когда они присоединились к группе.

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

Итак, для первой части мой запрос:

SELECT name, count(*)
FROM attendance, members
WHERE attendance.attend = 2 and
      attendance.member_number = members.number
GROUP BY attendance.member_number, attendance.attend
HAVING count(*) > 0
ORDER BY count(*) desc

Это возвращает всех участников 'имена, а также количество сессий, которые каждый посетил.Однако я также хотел бы добавить этот третий столбец.

Таким образом, для каждой записи мне сначала нужно выяснить, какая была дата members.member_since, а затем запросить только группу записей о посещаемости для каждого участника., для которых даты больше, чем member_since, получают их счет, затем из этого подмножества получают счет, где acceeance.attend = 2, а затем вычисляют, какой процент от этого количества подмножеств представляет второй счет (для записей, имеющих посещаемость = 2).

Как мне написать свой запрос?

Данные выглядят так:

Члены таблицы:

number, name, join_date
001, Peter James, 2016-07-26
002, John Smith, 2014-06-04

Посещаемость ТАБЛИЦЫ:

member_number, attend, date
001, 2, 2019-05-11
001, 1, 2019-05-04
001, 2, 2019-04-26
001, 2, 2019-04-18
002, 2, 2014-08-01
002, 1, 2016-08-01
002, 1, 2019-05-04

Желаемым результатом было бы получить следующее:

Name, Attended, percentage
Peter James, 3, 75%
John Smith, 1, 14%

Другими словами, хотя было 6 сессий, Питер Джеймс был участником только в течение последних четырех и присутствовал на 3 из них (75%), хотя Джон Смит является участником с самого начала, поэтому его посещаемость составляет один из 6.

Структура несколько упрощена (есть таблица «сессий» с подробной информацией о ses).Сроки, включая дату, и таблица «посещаемость» ссылается на ключевой столбец «att_number», а не на фактическую дату), но суть та же.

1 Ответ

1 голос
/ 21 мая 2019

Присоединяйтесь к таблицам только на даты, чтобы получить общее количество сеансов с момента присоединения участника. Затем используйте условное SUM(), чтобы получить количество сеансов, которые посетил участник. Разделите их, чтобы получить процент.

SELECT m.name, SUM(m.number = a.member_number AND a.attend = 2) AS attendance, 100*SUM(m.number = a.member_number AND a.attend = 2)/COUNT(*) AS percent
FROM members AS m
JOIN attendance AS a ON a.date >= m.member_since
GROUP BY m.number
ORDER BY attendance DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...