MySQL 查询统计订单

昨天运营的同事突然让帮忙查询统计数据,有几个数据之前没有处理过,遂记录下来。

  1. 每日付费的总人数。

一开始看到这个的时候觉得很简单,只要按照购买日期分组就可以了,SQL如下

SELECT COUNT(1),
		DATE(create_time) AS buy_date
FROM stock_app.t_order
WHERE DATE(create_time) 
BETWEEN '2019-02-14' 
AND '2019-04-23'
GROUP BY buy_date
ORDER BY buy_date

但是查完才发现数据对不上,因为同一个用户可能一天会购买不止一单,但是只能算一个,所以还需要做去重处理,SQL如下

SELECT COUNT(DISTINCT userid),
		DATE(create_time) AS buy_date
FROM stock_app.t_order
WHERE DATE(create_time) 
BETWEEN '2019-02-14' 
AND '2019-04-23'
GROUP BY buy_date
ORDER BY buy_date

COUNT(DISTINCT userid) 可以对相同的userid进行去重处理。

  1. 首付费人数

顾名思义就是第一次购买的用户,我们可以先查询出每个用户的首单的订单号,SQL如下

SELECT order_id
FROM  stock_app.t_order a
RIGHT JOIN (
	SELECT MIN(create_time) AS first_order_time,userid
	FROM stock_app.t_order
	GROUP BY userid
) b ON a.userid = b.userid AND a.create_time = b.first_order_time

然后将查询结果作为子查询的条件的做分组查询,SQL如下

SELECT COUNT(1),DATE(create_time) AS buy_date
FROM stock_app.t_order
WHERE DATE(create_time) BETWEEN '2019-02-14' AND '2019-04-23'
AND order_id IN (
	SELECT order_id
	FROM  stock_app.t_order a
	RIGHT JOIN (
		SELECT MIN(create_time) AS first_order_time,userid
		FROM stock_app.t_order
		GROUP BY userid
	) b ON a.userid = b.userid AND a.create_time = b.first_order_time
)
GROUP BY buy_date
ORDER BY buy_date
  1. 重复购买用户数

需要先查出一天购买多次的用户和订单时间,SQL如下

SELECT  userid,
	DATE(create_time) AS buy_date
FROM stock_app.t_order 
WHERE DATE(create_time) 
BETWEEN '2019-02-14' 
AND '2019-04-23'
GROUP BY userid,buy_date 
HAVING COUNT(userid) > 1
ORDER BY buy_date

再分组查询每天的重复用户数,如下

SELECT COUNT(1),buy_date
FROM
(
	SELECT  userid,
		DATE(create_time) AS buy_date
	FROM stock_app.t_order 
	WHERE DATE(create_time) 
	BETWEEN '2019-02-14' 
	AND '2019-04-23'
	GROUP BY userid,buy_date 
	HAVING COUNT(userid) > 1
	ORDER BY buy_date
) t1 
GROUP BY buy_date
ORDER BY buy_date
  1. 首付费用户购买金额最多的产品

先分组查询出每天各个产品的销售金额,并按金额从大到小排序,再对查询结果按交易日期分组,如下

SELECT  product,buy_date
FROM 
(
	SELECT product,
			SUM(total_fee) AS sum_fee,
			DATE(create_time) AS buy_date
	FROM stock_app.t_order  a
	WHERE DATE(create_time) 
	BETWEEN '2019-02-14' 
	AND '2019-04-23'
	AND userid  NOT IN (
		SELECT userid 
		FROM stock_app.t_order 
		WHERE DATE(create_time) < DATE(a.create_time)
		GROUP BY userid
	)
	GROUP BY product,buy_date 
	ORDER BY buy_date,sum_fee DESC
) t1 
GROUP BY buy_date 
  1. 重复购买用户购买金额最多的产品

这个第4个查询差不多,但是需要联表查询重复购买的用户,如下

SELECT  product,sum_fee,buy_date
FROM 
(
SELECT product,
		SUM(total_fee) AS sum_fee,
		DATE(create_time) AS buy_date
FROM stock_app.t_order  a
RIGHT JOIN(
	SELECT  userid,
		DATE(create_time) AS buy_date
	FROM stock_app.t_order 
	WHERE DATE(create_time) 
	BETWEEN '2019-02-14' 
	AND '2019-04-23'
	GROUP BY userid,buy_date 
	HAVING COUNT(userid) > 1
	ORDER BY buy_date 
) b ON a.userid = b.userid AND DATE(a.create_time) = b.buy_date
WHERE DATE(create_time) 
BETWEEN '2019-02-14' 
AND '2019-04-23'
GROUP BY product,buy_date 
ORDER BY buy_date,sum_fee DESC
) t1 
GROUP BY buy_date

仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值