Я полагаю, что значение connection.connection_date & users.creation_date составляет datetime .
Чтобы получить процент подключенных пользователей за месяц против всего пользователей на тот месяц , используйте:
SELECT u.user_group, DATE_FORMAT(`c`.`connection_date`, "%M %Y") AS month,
COUNT(DISTINCT u.`user_id`) / (SELECT COUNT(`user_id`) FROM users WHERE users.creation_date <= adddate(last_day(`c`.`connection_date`), 1) AND users.user_group = u.user_group) AS percentage,
COUNT(DISTINCT u.`user_id`) as loggedThisMonth,
(SELECT COUNT(`user_id`) FROM users WHERE users.creation_date <= adddate(last_day(`c`.`connection_date`), 1) AND users.user_group = u.user_group) AS totalRegisteredToMonth
FROM connections c LEFT JOIN users u ON c.`user_id` = u.`user_id`
GROUP BY u.user_group, DATE_FORMAT(`c`.`connection_date`, "%M %Y")
ORDER BY DATE_FORMAT(`c`.`connection_date`, "%Y %m"), u.user_group ASC
Это работает:
- подсчет DISTINCT users.user_ id которые подключались каждый месяц, таким образом предотвращая пересчет пользователей с несколькими подключениями в месяц
COUNT(DISTINCT u.user_id)
- , используя подвыбор для вычисления зарегистрированных пользователей группы пользователей дов этом месяце
(SELECT COUNT(
user_id ) FROM users WHERE users.creation_date <= adddate(last_day(
c .
connection_date ), 1) AND users.user_group = u.user_group)
Ссылка:
adddate(last_day(`c`.`connection_date`), 1)
возврат 1-го числа следующего месяца дата