admin 管理员组

文章数量: 1087817

sql题:求2017每个月的订单数、用户数、总成交金额

某电商公司为了统计自己的一些指标有以下需求

已知一个表订单表shopping2,有如下字段:Date_dt,Order_id,User_id,amount。
–数据样例:2017-01-01,10029028,1000003251,34。
–请给出sql进行统计:
1.给出 2017年每个月的订单数、用户数以及总成交金额。
2.给出11月的新客数(指在11月才有第一笔订单)

第一步建表

CREATE TABLE `shopping2` (`data_dt` varchar(30) DEFAULT NULL,`order_id` varchar(30) DEFAULT NULL,`user_id` varchar(30) DEFAULT NULL,`amount` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

第二步插入数据

insert into shopping2 values
('2017-01-01','10029028','1000003251',34)
,('2017-01-01','10029029','1000003251',34)
,('2017-01-01','100290288','1000003252',34)
,('2017-02-02','10029088','1000003251',34)
,('2017-02-02','100290281','1000003251',34)
,('2017-02-02','100290282','1000003253',34)
,('2017-11-02','10290282','100003253',234)
,('2017-11-01','102902810','100003253',234)
,('2018-11-02','10290284','100003243',234)

数据展示如下:

分析问题1
1.给出 2017年每个月的订单数、用户数以及总成交金额。
通过数据我们可以看到每一笔数据都会有一个订单号即使一个用户消费两次也会生成两个不一样的id,所以订单号为主键。而用户id是有重复的,问题问的是用户数,所以是去重之后的结果。
不难写出

select substr(dt,1,7) as data_dt,count(order_id) as order_sum,count(distinct user_id) as user_sum,sum(amount) from shopping2 group by 1 

结果如下:

问题2:给出11月的新客数(指在11月才有第一笔订单)

select count(1) from (
select user_id from (
select user_id,dt,row_number() over(partition by user_id order by dt) rn from shopping2 
)t1 
where rn = 1 and substr(t1.dt,6,2) = '11'
group by 1
)s 

结果如下:
结果为2

本文标签: sql题求2017每个月的订单数用户数总成交金额