查询结果如下:
合并  内蒙1                    160 
合并  内蒙2                    NULL 
合并  张家1                    100 
---  小计:                      260 
非合  北京1                    130 
非合  北京2                    NULL 
非合  北京3                    NULL 
---  小计:                      130想这样显示:
查询结果如下:
合并   内蒙1                    160 
      内蒙2                    NULL 
      张家1                    100 
---  小计:                      260 
非合  北京1                    130 
      北京2                    NULL 
      北京3                    NULL 
---  小计:                      130就是这一个字段,如果上下两行是相同的只显示第一行就可以了

解决方案 »

  1.   

    http://topic.csdn.net/u/20080826/10/cf6f4ace-9090-47fc-b2ec-ad3c079cc1ea.html
      

  2.   

    --> 测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (a varchar(4),b varchar(5),c int)
    insert into #T
    select '合并','内蒙1',160 union all
    select '合并','内蒙2',null union all
    select '合并','张家1',100 union all
    select '非合','北京1',130 union all
    select '非合','北京2',null union all
    select '非合','北京3',nullselect case when grouping(b)=1 then '--小计--' else a end a,
           case when isnull(b,'')='' then '' else b end b,
           sum(c) c
    from #T
    group by a,b
    with rollup
    having grouping(a)=0/*
    a        b     c           
    -------- ----- ----------- 
    非合       北京1   130
    非合       北京2   NULL
    非合       北京3   NULL
    --小计--         130
    合并       内蒙1   160
    合并       内蒙2   NULL
    合并       张家1   100
    --小计--         260
    */
      

  3.   

    你们看错题了吧
    查询结果如下: 
    合并  内蒙1                    160 
    合并  内蒙2                    NULL 
    合并  张家1                    100 
    非合  北京1                    130 
    非合  北京2                    NULL 
    非合  北京3                    NULL 
    想这样显示: 
    查询结果如下: 
    合并  内蒙1                    160 
          内蒙2                    NULL 
          张家1                    100 
    非合  北京1                    130 
          北京2                    NULL 
          北京3                    NULL 就是这一个字段,如果上下两行是相同的只显示第一行就可以了
      

  4.   

    create table #T (a varchar(4),b varchar(6),c int,id int identity(1,1))
    insert into #T
    select '合并','内蒙1',160 union all
    select '合并','内蒙2',null union all
    select '合并','张家1',100 unioN all
    SELECT '---','小计:',260 union all
    select '非合','北京1',130 union all
    select '非合','北京2',null union all
    select '非合','北京3',null unioN all
    SELECT '---','小计:',130
    UPDATE #T SET a=(CASE WHEN exists(SELECT 1 FROM #T WHERE a=a.a AND id+1=a.id) THEN '' ELSE a end) FROM #T aSELECT * FROM #T 
    DROP TABLE #t
    --result
    /*a    b      c           id          
    ---- ------ ----------- ----------- 
    合并   内蒙1            160           1 
         内蒙2    NULL                  2 
         张家1            100           3 
    ---  小计:            260           4 
    非合   北京1            130           5 
         北京2    NULL                  6 
         北京3    NULL                  7 
    ---  小计:            130           8 (所影响的行数为 8 行)*/
      

  5.   

    --> 测试数据: #T
    if object_id('tempdb.dbo.#T') is not null drop table #T
    create table #T (a varchar(4),b varchar(5),c int)
    insert into #T
    select '合并','内蒙1',160 union all
    select '合并','内蒙2',null union all
    select '合并','张家1',100 union all
    select '非合','北京1',130 union all
    select '非合','北京2',null union all
    select '非合','北京3',nullselect case when grouping(b)=1 then '--小计--' else a end a,
           case when isnull(b,'')='' then '' else b end b,
           sum(c) c
    into #
    from #T
    group by a,b
    with rollup
    having grouping(a)=0select case when b=(select min(b) from # where t.a=a) then a else '' end a,
           b,c
    from # tdrop table #/*
    a        b     c           
    -------- ----- ----------- 
    非合       北京1   130
             北京2   NULL
             北京3   NULL
    --小计--         130
    合并       内蒙1   160
             内蒙2   NULL
             张家1   100
    --小计--         260(所影响的行数为 8 行)
    */