有如下数据
工程编码 ,  工程名称,  工程卷册,          卷册负责人
60-F4401S,  *******,   60-F4401S-J0101,    张三
60-F4401S,  *******,   60-F4401S-J0102,    李四
60-F4401S,  *******,   60-F4401S-J0103,    王五
60-F2154S,  *******,   60-F2154S-D0101,    刘七
60-F2154S,  *******,   60-F2154S-K0104,    支八
60-F3124S,  *******,   60-F3124S-D0421,    范九
60-F3124S,  *******,   60-F3124S-H1245,    赵十
60-F3124S,  *******,   60-F3124S-S1243,    娄大
60-F1101S,  *******,   60-F1101S-J1236,    WANG想得到这样的结果
工程编码 ,  工程名称,  工程卷册,          卷册负责人
60-F4401S,  *******,   60-F4401S-J0101,    张三
60-F4401S,  *******,   60-F4401S-J0102,    李四
60-F4401S,  *******,   60-F4401S-J0103,    王五
小计,          3
60-F2154S,  *******,   60-F2154S-D0101,    刘七
60-F2154S,  *******,   60-F2154S-K0104,    支八
小计           2
60-F3124S,  *******,   60-F3124S-D0421,    范九
60-F3124S,  *******,   60-F3124S-H1245,    赵十
60-F3124S,  *******,   60-F3124S-S1243,    娄大
小计           3
60-F1101S,  *******,   60-F1101S-J1236,    WANG
小计           1

解决方案 »

  1.   

    select
        case when a.工程名称 is null then '小计' else a.工程编码 end as 工程编码,
        isnull(a.工程名称,rtrim(NUM)),
        a.工程卷册,
        a.卷册负责人
    from    
        (select 
             工程编码,工程名称,工程卷册,卷册负责人,COUNT(*) as NUM 
         from 
             TName 
         group by 
             工程编码,工程名称,工程卷册,卷册负责人
         having
             grouping(卷册负责人)=0 or (grouping(工程编码)=0 and grouping(工程名称)=1)) a
      

  2.   

    declare @t table(工程编码 varchar(30),  工程名称 varchar(30),
                    工程卷册 varchar(30),  卷册负责人 varchar(30))
    Insert into @t
    Select       '60-F4401S','*******','60-F4401S-J0101','张三'
    union select '60-F4401S','*******','60-F4401S-J0102','李四'
    union select '60-F4401S','*******','60-F4401S-J0103','王五'
    union select '60-F2154S','*******','60-F2154S-D0101','刘七'
    union select '60-F2154S','*******','60-F2154S-K0104','支八'
    union select '60-F3124S','*******','60-F3124S-D0421','范九'
    union select '60-F3124S','*******','60-F3124S-H1245','赵十'
    union select '60-F3124S','*******','60-F3124S-S1243','娄大'
    union select '60-F1101S','*******','60-F1101S-J1236','WANG' 
    Select (Case when a.工程名称 is null then '小计' else a.工程编码 end) as 工程编码,
            isnull(a.工程名称,Rtrim(NUM)) as 工程名称, isNULL(a.工程卷册,'') as 工程卷册, 
            isnull(a.卷册负责人,'') as 卷册负责人
    from    
        ( Select 工程编码,工程名称,工程卷册,卷册负责人,COUNT(*) as NUM 
          from @t
          group by  工程编码,工程名称,工程卷册,卷册负责人
          With rollup
          having (grouping(卷册负责人)=0) or 
                 (grouping(工程编码)=0  and grouping(工程名称)=1) 
    ) a
      

  3.   

    列数少可以这样,但是我的列数很多,提示group by 最多不能超过10列,这样的情况怎么办?
    还有
    having (grouping(卷册负责人)=0) or 
                 (grouping(工程编码)=0  and grouping(工程名称)=1) 
    没有看明白,能解释下吗>?先谢谢