日期:2014-05-17  浏览次数:20538 次

求每个店铺每件商品的销售额的前5
实际要求比这个还要复杂,我简略的描述一下。

门店|商品|数量|销售额
A001,C001,1,1
A001,C002,2,2
A001,C003,3,3
A002,C001,1,1
A002,C003,3,3
A004,C004,4,4
A004,C002,2,2

求每个门店销售额前5的商品,数量总和,销售额总和
结果最好为
门店1|商品TOP1|TOP1总量|TOP1销售总额 ..... |商品TOP5|TOP5总量|TOP5销售总额
门店2|商品TOP1|TOP1总量|TOP1销售总额 ..... |商品TOP5|TOP5总量|TOP5销售总额

结果实在变换太麻烦的话,竖排也行
门店1|商品TOP1|TOP1总量|TOP1销售总额
门店1|商品TOP2|TOP2总量|TOP2销售总额

求每家店铺,每种商品的两次分组计算的SQL文。
注:不要求必须一行实现

------解决方案--------------------
适合2005及以上的版本:

--drop table tb


create table tb(门店 varchar(10),商品 varchar(10),数量 int,销售额 numeric(10,2))

insert into tb
select 'A001','C001',1,1 union all
select 'A001','C002',2,2 union all
select 'A001','C003',3,3 union all
select 'A002','C001',1,1 union all
select 'A002','C003',3,3 union all
select 'A004','C004',4,4 union all
select 'A004','C002',2,2
go

;with t1
as
(
select *,
       ROW_NUMBER() over(PARTITION by 门店 order by 销售额 desc) rownum
from tb
),

t2
as
(
select *,
       门店+'
------解决方案--------------------
'+商品+'
------解决方案--------------------
'+cast(数量 as varchar)+'
------解决方案--------------------
'+cast(销售额 as varchar) as v
from t1
where rownum <= 5
)

select distinct 
       STUFF((select '
------解决方案--------------------
'+v from t2 b where a.门店 = b.门店 for xml path('')),
             1,1,'') as v
from t2 a
/*
v
A001
------解决方案--------------------
C003
------解决方案--------------------
3
------解决方案--------------------
3.00
------解决方案--------------------
A001
------解决方案--------------------
C002
------解决方案--------------------
2
------解决方案--------------------
2.00
------解决方案--------------------
A001
------解决方案--------------------
C001
------解决方案--------------------
1
------解决方案--------------------