подсчитывать новых пользователей каждый месяц в sql - PullRequest
0 голосов
/ 03 августа 2020

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

Необходимые данные по месяцам, которые регистрируются по месяцам новых пользователей

JAn  Feb  Mar  April May ..... Dec

1     2   4     2     5 .....  1

через дату created_at и идентификатор пользователя.

вот таблица_пользователей

id     created_at
1      2020-01-09 22:38:55
2      2020-02-09 22:38:55
3      2020-02-09 22:38:55
4      2020-03-09 22:38:55
5      2020-03-09 22:38:55
6      2020-03-09 22:38:55
7      2020-04-09 22:38:55
8      2020-04-09 22:38:55
9      2020-05-09 22:38:55

я пытаюсь выполнить этот запрос

SELECT  ut.id, Month(FROM_UNIXTIME(ut.created_at)), Count(*) 
from  $userTable ut 
where FROM_UNIXTIME(ut.created_at) >= CURDATE() - INTERVAL 1 YEAR
GROUP BY Month(FROM_UNIXTIME(ut.created_at));
       

Ответы [ 3 ]

1 голос
/ 03 августа 2020

Вы можете группировать по годам и суммировать по месяцам следующим образом:

 select YEAR(created_at) as year,
  sum(case when Month(created_at) = 1 then 1 else 0 end) AS Jan,
  sum(case when Month(created_at) = 2 then 1 else 0 end) AS Feb,
  sum(case when Month(created_at) = 3 then 1 else 0 end) AS Mar,
  sum(case when Month(created_at) = 4 then 1 else 0 end) AS Apr,
  sum(case when Month(created_at) = 5 then 1 else 0 end) AS May,
  sum(case when Month(created_at) = 6 then 1 else 0 end) AS Jun,
  sum(case when Month(created_at) = 7 then 1 else 0 end) AS Jul,
  sum(case when Month(created_at) = 8 then 1 else 0 end) AS Aug,
  sum(case when Month(created_at) = 9 then 1 else 0 end) AS Sep,
  sum(case when Month(created_at) = 10 then 1 else 0 end) AS Oct,
  sum(case when Month(created_at) = 11 then 1 else 0 end) AS Nov,
  sum(case when Month(created_at) = 12 then 1 else 0 end) AS Dec from ut group by YEAR(created_at) 
0 голосов
/ 03 августа 2020

Если вы хотите смешать данные этого года и прошлого года за последние 12 месяцев, вы можете использовать:

SELECT SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 1) AS Jan,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 2) AS Feb,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 3) AS Mar,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 4) AS Apr,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 5) AS May,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 6) AS Jun,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 7) AS Jul,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 8) AS Aug,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 9) AS Sep,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 10) AS Oct,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 11) AS Nov,
       SUM(MONTH(FROM_UNIXTIME(ut.created_at)) = 12) AS Dec
FROM ut
WHERE FROM_UNIXTIME(ut.created_at) >= CURDATE() - INTERVAL 1 YEAR

Примечание. Это предполагает, что FROM_UNIXTIME() действительно необходимо. Он также использует удобный ярлык MySQL для условного агрегирования.

0 голосов
/ 03 августа 2020

все столбцы, которые используются в выборке, которые не являются агрегированной функцией, должны быть сгруппированы, ut.id не является группой и в вашем случае должен быть удален из выбора

Попробуйте

SELECT  Month(FROM_UNIXTIME(ut.created_at)), Count(*) from  $userTable ut 
where FROM_UNIXTIME(ut.created_at) >= CURDATE() - INTERVAL 1 YEAR
GROUP BY Month(FROM_UNIXTIME(ut.created_at));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...