where条件、group by all 和 rollup不能同时使用,那我怎么实现这个效果呢?
if exists(select * from sysobjects where name= 'p_StatSale ')
drop proc p_StatSale
go
create procedure p_StatSale
@StartDate datetime,
@EndDate datetime
as
declare @s varchar(8000)
select @s= 'select 组名=(case when grouping(b.组名)=1 then ' ' ' ' when grouping(b.姓名)=1 then ' ' ' ' else b.组名 end),
姓名=(case when grouping(b.组名)=1 then ' '总计 ' ' when grouping(b.姓名)=1 then ' '合计 ' ' else b.姓名 end) '
select @s=@s+ ', '+quotename(txt, ' ' ' ')+ '=sum(case 车型 when '+quotename(txt, ' ' ' ')+ ' then 1 else 0 end) '
from tb_car_type where depth=2 group by txt
select @s=@s+ ',合计=count(车型) from vw_car_sale_stat a right join vw_saler_group b on a.员工编号=b.员工编号
where 销售时间 between '+quotename(@StartDate, ' ' ' ')+ ' and '+quotename(@EndDate, ' ' ' ')+ ' group by b.组名,b.姓名 with rollup '
print(@s)
exec(@s)
go
exec p_StatSale @StartDate= '2007-1-1 ',@EndDate= '2007-12-1 '
------------
相关表简单说明
tb_car_type:ID Txt ParentID Depth
实际是一个双编号的车型树,Depth为2表示具体车型
vw_car_sale_stat:车号 车型 员工编号 销售时间
vw_saler_group:员工编号 组名
----------
要统计某段时间内所有销售员工所有车型的销售情况,没有销售记录的用零表示
大概效果如下:
组名 姓名 L4 L4+ GL3.5 GL GL2.5 总计
展厅一部 张三 0 1 0 1 0 2
展厅一部 李四 1 0 0 0 0 1
合计 1 1 0 1 0 3
展厅二部 王五 0 0 0 1 0 1
合计 0 0 0 1 &