Mysql 查询:统计某月每日新增用户在新增当天的充值笔数、当天新增用户充值的总人数和充值总金额

查询结果要求.png
表结构.png

一、需求分析

统计2018年12月,【每日】的【新增用户在新增当天的充值笔数】、【每日充值的人员当中属于当日新增用户的人数】和【每日新增用户充值的总金额】,新增用户在新增日后的充值均不在统计范围内

二、测试分析:

1. 数据表选择:输出字段要求包含充值日期DATE、充值次数JYBS(count(A.trade_no))、充值人数CZRS(count(DISTINCT A.user_id))、充值金额CZJE(sum(A.trade_price)),所以选取le_user_deposit表 AS A;

2. 约束条件:业务发生时间是在2018年12月内,且必须是新增用户,而对于新增用户的选择,需要关联le_user AS B 表进行筛选
              所以查询语句的Where条件必须限定业务发生的时间(A.gmt_create BETWEEN '2018-01-01 00:00:00' AND '2018-12-31 23:59:59'),并且排除掉在12.01之前已注册用户 B.gmt_create >= '2018-12-01 00:00:00'的业务

3. 场景设计:只统计新增用户在新增日当天的充值业务,即5种情况须考虑
   ①用户A在12.01当天注册并充值1笔,该笔数据统计;
   ②用户A在12.02/12.03/12.05这几天均有充值,该部分数据不统计,所以查询语句中必须要排除非注册当天的业务数据;
   ③用户B在12.01当天注册,但当天未充值,而是在12.03号充值,则该数据不统计;
   ④用户C在12.01当天注册,且充值多笔,则充值次数JYBS统计多次,充值人数CZRS只统计1次,充值金额CZJE累计多笔
   ⑤用户D已注册用户B在12.01当天充值,该部分数据不统计,所以where条件必须判断

三、创建数据,验证sql语句正确性

-- 1.1 创建用户表
CREATE TABLE `le_user` (
  `user_id` varchar(20) DEFAULT NULL COMMENT '用户ID',
  `phone_num` varchar(20) DEFAULT NULL COMMENT '用户手机号码',
  `gmt_create` datetime DEFAULT NULL COMMENT '用户数据生成时间',
  `gmt_modify` datetime DEFAULT NULL COMMENT '用户数据修改时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 1.2 创建用户充值记录表
CREATE TABLE `le_user_deposit` (
  `deposit_id` varchar(20) DEFAULT NULL COMMENT '用户主键ID',
  `user_id` varchar(20) DEFAULT NULL COMMENT '用户ID',
  `trade_no` varchar(128) DEFAULT NULL COMMENT '交易订单号',
  `trade_price` varchar(16) DEFAULT NULL COMMENT '交易金额',
  `gmt_create` datetime DEFAULT NULL COMMENT '订单生成时间',
  `gmt_modify` datetime DEFAULT NULL COMMENT '订单修改时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 2.1 注册用户
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0001', '13100010001','2018-12-01 12:00:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0002', '13100010002','2018-12-01 12:00:19');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0003', '13100010003','2018-12-01 12:03:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0004', '13100010004','2018-12-01 12:40:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0000', '13100010000','2018-11-01 12:00:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0005', '13100010005','2018-12-11 12:00:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0006', '13100010006','2018-12-21 12:00:19');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0007', '13100010007','2018-12-12 12:03:09');
insert INTO le_user (user_id, phone_num, gmt_create) VALUES ('LE0008', '13100010008','2018-12-21 12:40:09');


-- 2.2 添加用户充值记录
-- (1). 用户A(LE0001)在12.01当日注册,并在当日和隔日充值多笔
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011209','LE0001','TN20181201120009','10.00','2018-12-01 12:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011219','LE0001','TN20181201121909','10.00','2018-12-01 12:19:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011240','LE0001','TN20181201124009','10.00','2018-12-01 12:40:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011310','LE0001','TN20181201131009','10.00','2018-12-01 13:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011340','LE0001','TN20181201124009','10.00','2018-12-01 13:40:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812021209','LE0001','TN20181202120009','15.00','2018-12-02 12:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812021219','LE0001','TN20181202121909','20.00','2018-12-02 12:19:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812021240','LE0001','TN20181202124009','30.00','2018-12-02 12:40:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812021310','LE0001','TN20181202131009','10.00','2018-12-02 13:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812021340','LE0001','TN20181202124009','10.00','2018-12-02 13:40:09');

-- (2)用户B(LE0002)在12.01当天注册,隔日12.03充值
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI20181203141009','LE0002','TN20181203141009','15.00','2018-12-03 14:10:09');

-- (3)用户C(LE0003)在12.01当天注册,且充值1笔
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812011809','LE0003','TN20181201180009','25.00','2018-12-01 18:10:09');

-- (4) 用户D(LE0000)在上月已注册当天充值,并在12月充值多笔
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201811011209','LE0000','TN20181101120009','10.00','2018-11-01 12:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI201812016209','LE0000','TN20181201160009','10.00','2018-12-01 16:10:09');
INSERT INTO le_user_deposit (deposit_id, user_id, trade_no, trade_price, gmt_create) VALUES ('DI20181202111009','LE0000','TN20181202111009','30.00','2018-12-02 11:10:09');

-- 3.1 查询所有数据
SELECT user_id, phone_num, date_format(gmt_create, '%Y-%m-%d') AS DATE_RE FROM le_user ORDER BY gmt_create ASC;
SELECT deposit_id, user_id, trade_no, trade_price, date_format(A.gmt_create, '%Y-%m-%d') AS DATE_user_create FROM le_user_deposit A ORDER BY A.gmt_create ASC;

-- 3.2 确定le_user_deposit表中每日充值的新增用户
select user_id, min(date_format(gmt_create, '%Y-%m-%d')) as date_cz from le_user_deposit group by user_id;

四、 查询语句

SELECT
    date_format(A.gmt_create, '%Y-%m-%d') AS DATE_NEW,
    count(A.deposit_id) AS CZBS,
    count(DISTINCT A.user_id) AS CZRS,
    sum(A.trade_price) CZJE
FROM le_user_deposit A
WHERE(A.gmt_create BETWEEN '2018-12-01 00:00:00' AND '2018-12-31 23:59:59')
AND A.user_id NOT IN (SELECT user_id FROM le_user WHERE gmt_create < '2018-12-01 00:00:00')
AND date_format(A.gmt_create, '%Y-%m-%d') IN (SELECT min(date_format(B.gmt_create, '%Y-%m-%d')) AS date_cz FROM le_user_deposit B WHERE B.gmt_create GROUP BY B.user_id)
GROUP BY DATE_NEW;

以上仅个人理解,场景考虑可能不全面,期待大家补充。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 活跃用户指的是什么?ARPU怎么算?如何计算LTV? 这个付费渗透率是个啥玩意怎么算?那个3日留存里的3日指的是第...
    大熊818阅读 25,248评论 2 40
  • 一.数据控制语句(DML)部分 1.INSERT(往数据表里插入记录的语句) INSERTINTO表名(字段名1,...
    浮浮尘尘阅读 3,505评论 0 19
  • 移动游戏的生命周期运营可以归纳为如下转化过程: 获得用户(下载安装)-> 转化为活跃用户(登录使用) -> 留住用...
    JunChow520阅读 5,259评论 0 5
  • 天晴了,暖暖的阳光。 很喜欢每年这种可以穿两件 也穿一件短袖又有点冷的感觉 时光是不是永远都不急不慢 优雅的步伐。...
    c_107c阅读 252评论 0 4
  • 在 Swift 4.0 基础学习总结(一)中,我们学习的Swift中的基本数据类型以及控制流,Swift简介的语法...
    xx_cc阅读 1,520评论 3 11