需求
一天運營的小姐姐跟我說,我想要一個報表,來分析從上線到現在使用者每個月的註冊數量,按照月份就行統計。並且我要知道截止到這個月總的使用者數是多少。
分析
拿到這個需求我們先看一下使用者表 users 的結構是什麼
id | name | create_at |
---|---|---|
1 | nihao | 2020-10-05 15:55:55 |
2 | wohao | 2020-10-06 15:55:55 |
那麼運營的小姐姐想要得到的表是什麼
當月累計 | 當月新增 | 時間年月 |
---|---|---|
1 | 1 | 2020-10 |
6 | 5 | 2020-11 |
mysql語句
首先我們先得到每個月的新增人數,這個沒那麼複雜
SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date
我們得到的表為
num | date |
---|---|
1 | 2020-10 |
5 | 2020-11 |
我們將上面的sql語句成為A
關鍵的時候來了
我們要拿到累計的數量,就需要把A語句當做一個結果表 BB
select sum(num) from {(A) as BB}
相當於
select sum(欄位) from 表BB 我們成為 C語句
關鍵時候來了,我們要得到每個月的累計那麼,就要每個月進行一次sum操作,那麼就要求每次查詢都要小於等於在A語句的結果的日期的那個記錄進行sum
那麼我們就要繼續建立一個A語句的結果表我們成為AA
select ( C語句 where BB.date<= AA.date )as tnum,AA.num,AA.date from A語句 as AA
最後整理一下就是如下語句
select (
select SUM((bb.num)) from (
SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date
) as bb where aa.date >=bb.date
) as tnum,aa.num,aa.date from (SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date ) aa
本作品採用《CC 協議》,轉載必須註明作者和本文連結