在SQL中每月统计新用户

时间:2020-08-03 05:09:47

标签: mysql sql

我正在尝试计算今年每个月记录的新用户。 喜欢


每月需要数据,由每月新用户注册

JAn  Feb  Mar  April May ..... Dec

1     2   4     2     5 .....  1

通过created_at日期和用户ID。

这是user_table

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 个答案:

答案 0 :(得分:1)

您可以按年份分组,按月汇总:

 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) 

答案 1 :(得分:0)

在select中使用的不是聚合函数的所有列都需要进行分组,而ut.id不是group,在您的情况下应从select中删除

尝试

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));

答案 2 :(得分:0)

如果要混合使用过去12个月的今年和去年的数据,可以使用:

@SpringBootTest
@AutoConfigureTestDatabase
@ContextConfiguration(locations = { "classpath*:resources/invoices-context.xml",
        "classpath*:resources/invoices-int-schema.xml" })
public class RoomRepositoryTest {

    @Autowired
    RoomRepository roomRepository;

    private RoomEntity roomEntity;

    @Test
    public void findRommByDateTest() throws ParseException {
        String startDate = "27-07-2020";
        sDate = new SimpleDateFormat("dd-mm-yyyy").parse(startDate);
        String endDate = "28-07-2020";
        eDate = new SimpleDateFormat("dd-mm-yyyy").parse(endDate);
        String roomType = "SINGLE";

        roomEntity = new RoomEntity();
        roomEntity.setRoomId(1);
        roomEntity.setRoomPrice(6000);
        roomEntity.setRoomStatus("AVAILABLE");
        roomEntity.setRoomType("SINGLE");

        //adding data for testing  
        roomRepository.save(roomEntity)
        
        //test the actual function
        int id = roomRepository.findRoomByDate(sDate,eDate);
        assertEquals(1, id);
   
}

注意:这假设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 实际上是必需的。它还使用方便的MySQL快捷方式进行条件聚集。

相关问题