类型  颜色 规格 数量   单价   金额
11     红   X    2      3      6
11     红   L    1      3      3
11     绿   XXL  1      3      3
11     红   X    1      3      3
22     绿   XXL  1      4      4
22     绿   XXXL 1      4      4
22     黑   L    1      4      4
;;     ;;   ;;   ;      ;      ;
我想得到一个这样的汇总
类型  颜色  X   L    XXL  XXXL  .... (小计)数量   单价   金额
11    红    3   1                           4      3      12
11    绿              1                     1      3       3
小计                                        5             15
22    绿              1     1               2      4       8
22    黑        1                           1      4       4 
....   .....    .......
......  ......   ....... 
小计                                        3             12
合计                                        8             27  
请高手指点一下,谢谢!!!!!

解决方案 »

  1.   

    declare @s varchar(8000)
    set @s = 'select 类型,颜色'
    select @s= @s +',['+规格+'] = sum(case 规格 when '''+规格+''' then 数量 else 0 end)'
    from (select 规格 from table group by 规格 group by 规格) aexec(@s+',单价'+ ' from table group by  类型,颜色,单价 WITH CUBE')
      

  2.   

    create table t(类型 varchar(10),颜色 varchar(10),规格 varchar(10),数量 int,单价 int,金额 int)
    insert into t select '11','红','X   ',2,3,6
    insert into t select '11','红','L   ',1,3,3
    insert into t select '11','绿','XXL ',1,3,3
    insert into t select '11','红','X   ',1,3,3
    insert into t select '22','绿','XXL ',1,4,4
    insert into t select '22','绿','XXXL',1,4,4
    insert into t select '22','黑','L   ',1,4,4declare @s varchar(8000)
    set @s='select (case when 类型 is null then ''合计'' when 颜色 is null then ''小计'' else 类型 end) as 类型,isnull(颜色,'''') as 颜色'
    select @s=@s+',['+规格+']=sum(case 规格 when '''+规格+''' then 数量 else 0 end)' 
    from t group by 规格 order by 规格
    set @s=@s+',[数量(小计)]=sum(数量),单价=max(单价),金额=sum(金额) from t group by 类型,颜色 with rollup'
    exec(@s)/*
    类型       颜色         L         X           XXL         XXXL        数量(小计)  单价        金额          
    ---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    11         红          1          3           0           0           4           3           12
    11         绿          0          0           1           0           1           3           3
    小计                   1          3           1           0           5           3           15
    22         黑          1          0           0           0           1           4           4
    22         绿          0          0           1           1           2           4           8
    小计                   1          0           1           1           3           4           12
    合计                   2          3           2           1           8           4           27
    */drop table t
      

  3.   

    create table t(类型 varchar(10),颜色 varchar(10),规格 varchar(10),数量 int,单价 int,金额 int)
    insert into t select '11','红','X   ',2,3,6
    insert into t select '11','红','L   ',1,3,3
    insert into t select '11','绿','XXL ',1,3,3
    insert into t select '11','红','X   ',1,3,3
    insert into t select '22','绿','XXL ',1,4,4
    insert into t select '22','绿','XXXL',1,4,4
    insert into t select '22','黑','L   ',1,4,4declare @s varchar(8000)
    set @s='select (case when 类型 is null then ''合计'' when 颜色 is null then ''小计'' else 类型 end) as 类型,颜色'
    select @s=@s+',['+规格+']=sum(case 规格 when '''+规格+''' then 数量 else 0 end)' 
    from t group by 规格 order by 规格
    set @s=@s+',[数量(小计)]=sum(数量),单价,金额=sum(金额) from t group by 类型,颜色,单价 with rollup having grouping(单价)=0 or grouping(颜色)=1'
    exec(@s)/*
    类型       颜色       L           X           XXL         XXXL        数量(小计)  单价        金额          
    ---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    11         红         1           3           0           0           4           3           12
    11         绿         0           0           1           0           1           3           3
    小计       NULL       1           3           1           0           5           NULL        15
    22         黑         1           0           0           0           1           4           4
    22         绿         0           0           1           1           2           4           8
    小计       NULL       1           0           1           1           3           NULL        12
    合计       NULL       2           3           2           1           8           NULL        27
    */drop table t
      

  4.   

    to:libin_ftsafe(子陌红尘) 
    咋不行啊,
    说什么:
    不能使用空白的对象或列名。如果必要,请使用一个空格。
      

  5.   

    --写存储过程的话, 只需要加个头, 在查询分析器中执行一下, 就建立好存储过程了.
    --以后就可以用: exec 存储过程名 来调用create proc 存储过程名
    as
    set nocount on
    declare @s varchar(8000)
    set @s='select (case when 类型 is null then ''合计'' when 颜色 is null then ''小计'' else 类型 end) as 类型,颜色'
    select @s=@s+',['+规格+']=sum(case 规格 when '''+规格+''' then 数量 else 0 end)' 
    from t group by 规格 order by 规格
    set @s=@s+',[数量(小计)]=sum(数量),单价,金额=sum(金额) from t group by 类型,颜色,单价 with rollup having grouping(单价)=0 or grouping(颜色)=1'
    exec(@s)