一、有一个这样的需求,统计出在每个国家的销量并排序,所得的结果应该包含国家、销量、排名等字段。排序好办,有一个问题是如何新增排名这个字段,可以有如下几种方式,
假设对销量排序的结果是中间表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