日期:2014-05-19  浏览次数:20513 次

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         &