生产遇到的疑难问题汇总

一、有一个这样的需求,统计出在每个国家的销量并排序,所得的结果应该包含国家、销量、排名等字段。排序好办,有一个问题是如何新增排名这个字段,可以有如下几种方式,
假设对销量排序的结果是中间表temp,包括国家(delivery_country)、销量(sale_count)两个字段。
1、通过select子查询的方式构造rank字段

select 
	(
	select 
		count(*) from temp b where 
		b.sale_count > a.sale_count or 
		(b.sale_count = a.sale_count and 
		b.delivery_country > a.delivery_country)
	)+1 as rank,
	temp.*
	from temp a
	order by rank

2、用户变量

set @rownum=0;	
	select t.*,@rownum := @
	rownum +1 as rank from temp t

二、需求:统计某个时间段内,每个的数据,如果当月没有数据则显示为0。在实际操作中,按月分组统计数据的时候,只显示有数据的时间,
没有数据则不显示,为了实现我们的需求,有一下几种方法:
1、在统计的时候,外层嵌套循环对每个月汇总

	sum(case when 月份=2017-11月 then sales_count else 0 end) neg_7,
	sum(case when 月份=2017-12月 then sales_count else 0 end) neg_6,
	sum(case when 月份=2018-01月 then sales_count else 0 end) neg_5,
	sum(case when 月份=2018-02月 then sales_count else 0 end) neg_4,
	sum(case when 月份=2018-03月 then sales_count else 0 end) neg_3,

2、可以找一个数据库中的表,设置用户变量

select @num:=-1

select 
	@num:=@num+1,
	date_format(adddate(CONCAT('2017-11','-01'), 
	INTERVAL @num MONTH),'%Y-%m') as month 
	from customer_sta 
	where date_format(adddate(CONCAT('2017-11','-01'),
	INTERVAL @num MONTH),'%Y-%m') < date_format(curdate(),'%Y-%m-%d') 
	order by month 

如上所示的sql即取得从2017年11月开始到现在为止的所有月份。将其与我们的中间结果集进行关联即可得。也可以将上述sql改写成如下形式。

select 
	@num:=@num+1,date_format(adddate($concat_select, 
	INTERVAL @num MONTH),'%Y-%m') as month
	from customer_sta,(select @num:=-1) t 
	where date_format(adddate($concat_select, 
	INTERVAL @num MONTH),'%Y-%m') < date_format(curdate(),'%Y-%m-%d')
	order by month
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值