MySql row_number TOP5 排队 编号

报表统计,要求展示会员第一次购买、第二次购买、第三次购买金额与流水号。

如果不是使用MySQL,直接使用row_number函数对一个会员购买次数进行排序就可以了,但是目前MySQL5.16不支持row_number函数。

所以查询了下资料,使用MySQL简单进行流式处理。

SELECT
  IF
	(@num = sale.vip_code, @rank := @rank + 1, @rank := 1 ) AS rank,
	@num := sale.vip_code  vip_code ,----- 会员编码,
	sale.vip_code,     ----- 会员编码
	sale.crt_date,     ----- 交易时间
	sale.sale_no,      ----- 流水号
	sale.fin_total     ----- 金额
FROM
	vip_con_sale sale     -----交易流水表
WHERE
	sale.crt_date >= date_sub( now( ), INTERVAL 100 DAY )  ----- 查询最近100天数据
ORDER BY
	sale.vip_code ASC,   ----- 按会员号排序
	sale.crt_date ASC    ----- 根据时间进行排序

结果如下图:

然后进行行转列操作,即对会员分组后,通过case when then else end 进行判断。

SELECT
	base.vip_code,
	sum( CASE WHEN base.rank = 1 THEN fin_total ELSE 0 END ) AS oneBuy,
	sum( CASE WHEN base.rank = 1 THEN sale_no ELSE 0 END ) AS oneBuySaleNo,
	sum( CASE WHEN base.rank = 2 THEN fin_total ELSE 0 END ) AS twoBuy,
	sum( CASE WHEN base.rank = 2 THEN sale_no ELSE 0 END ) AS twoBuySaleNo,
	sum( CASE WHEN base.rank = 3 THEN fin_total ELSE 0 END ) AS thrBuy,
	sum( CASE WHEN base.rank = 3 THEN sale_no ELSE 0 END ) AS thrBuySaleNo 
FROM
	(
SELECT
IF
	( @num = sale.vip_code, @rank := @rank + 1, @rank := 1 ) AS rank,
	@num := sale.vip_code vip_code,
	sale.crt_date,
	sale.sale_no,
	sale.fin_total 
FROM
	vip_con_sale sale 
WHERE
	sale.crt_date >= date_sub( now( ), INTERVAL 100 DAY ) 
ORDER BY
	sale.vip_code ASC,
	sale.crt_date ASC 
	) base
GROUP BY
	base.vip_code

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值