create table tt 
(产地 char(8),水果 char(8),重量 int  ) 
insert tt values('北方','香蕉',3) 
insert tt values('北方','水蜜桃',2) 
insert tt values('南方','桔子',3) 
insert tt values('北方','水蜜桃',5) 
insert tt values('南方','香蕉',3) 
insert tt values('南方','水蜜桃',6) 
insert tt values('北方','桔子',8) 
select * from tt
select 产地,水果,sum(重量) 总重量 from tt group by 产地,水果 with rollup运行以后结果如下:产地       水果       总重量         
-------- -------- ----------- 
北方       桔子       8
北方       水蜜桃      7
北方       香蕉       3
北方       NULL     18
南方       桔子       3
南方       水蜜桃      6
南方       香蕉       3
南方       NULL     12
NULL     NULL     30(所影响的行数为 9 行)
现在我想问的是如何将
1、第四行的"null"换成小计,即北方的水果共18斤。
2、第八行的"null"换成小计,即南方的水果共12斤。
3、最后一行的"null" 换成 "总计" ,即 总计 30 斤水果 。
谢谢

解决方案 »

  1.   


    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8)
    select CASE WHEN (GROUPING(产地) = 1) THEN '总计'
                ELSE ISNULL(产地, 'UNKNOWN')
           END AS 产地,
           CASE WHEN (GROUPING(水果) = 1) THEN '小计'
                ELSE ISNULL(水果, 'UNKNOWN')
           END AS 产地,sum(重量) 总重量 from tt group by 产地,水果 with rollup  /*
    产地       产地       总重量
    -------- -------- -----------
    北方       桔子       8
    北方       水蜜桃      7
    北方       香蕉       3
    北方       小计       18
    南方       桔子       3
    南方       水蜜桃      6
    南方       香蕉       3
    南方       小计       12
    总计       小计       30(9 行受影响)*/drop table TT
      

  2.   

    if object_id('tt')is not null drop table tt
    go
    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8) 
    SELECT CASE WHEN (GROUPING(产地) = 1) THEN N'总计'
                ELSE ISNULL(产地, 'UNKNOWN')
           END AS 产地 ,
           CASE WHEN (GROUPING(水果) = 1) THEN N'小计'
                ELSE ISNULL(水果, 'UNKNOWN')
           END AS 水果,
           SUM(重量 ) AS 重量 
    FROM tt
    GROUP BY 产地, 水果 WITH ROLLUP
    /*
    产地       水果       重量
    -------- -------- -----------
    北方       水蜜桃      7
    北方       香蕉       3
    北方       桔子       8
    北方       小计       18
    南方       水蜜桃      6
    南方       香蕉       3
    南方       桔子       3
    南方       小计       12
    总计       小计       30(9 個資料列受到影響)
    */
      

  3.   


    if object_id('tt')is not null drop table tt
    go
    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8) select * from (
    select 产地,水果,sum(重量) 总重量 from tt group by 产地,水果
    union all
    select 产地,水果=max('合计'),sum(重量) 总重量 from tt group by 产地
    union all
    select 产地='总计',null,sum(重量) 总重量 from tt 
    )t
    order by 产地,charindex('合计',水果) 产地       水果       总重量
    -------- -------- -----------
    北方       桔子       8
    北方       水蜜桃      7
    北方       香蕉       3
    北方       合计       18
    南方       香蕉       3
    南方       水蜜桃      6
    南方       桔子       3
    南方       合计       12
    总计       NULL     30(9 行受影响)
      

  4.   

    最后一行的两个null,都要换成总计
      

  5.   


    select CASE WHEN (GROUPING(产地) = 1) THEN '总计'
                ELSE ISNULL(产地, 'UNKNOWN')
           END AS 产地,
           CASE WHEN (GROUPING(产地) = 1) THEN '总计' WHEN (GROUPING(水果) = 1) THEN '小计' WHEN (GROUPING(水果) = 1) THEN '总计'
                ELSE ISNULL(水果, 'UNKNOWN')
           END AS 产地,
    sum(重量) 总重量 from tt group by 产地,水果 with rollup  /*
    产地       产地       总重量
    -------- -------- -----------
    北方       桔子       8
    北方       水蜜桃      7
    北方       香蕉       3
    北方       小计       18
    南方       桔子       3
    南方       水蜜桃      6
    南方       香蕉       3
    南方       小计       12
    总计       总计       30(9 行受影响)
    */
      

  6.   


    if object_id('tt')is not null drop table tt
    go
    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8) select * from (
    select 产地,水果,sum(重量) 总重量 from tt group by 产地,水果
    union all
    select 产地,水果=max('小计'),sum(重量) 总重量 from tt group by 产地
    union all
    select 产地='总计','总计',sum(重量) 总重量 from tt 
    )t
    order by 产地,charindex('小计',水果) 产地       水果       总重量
    -------- -------- -----------
    北方       桔子       8
    北方       水蜜桃      7
    北方       香蕉       3
    北方       小计       18
    南方       香蕉       3
    南方       水蜜桃      6
    南方       桔子       3
    南方       小计       12
    总计       总计       30(9 行受影响)
      

  7.   


    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8) 
    select * from tt 
    select 
    CASE WHEN (GROUPING(产地) = 1) THEN '总计'
                ELSE ISNULL(产地, 'UNKNOWN')
           END AS 产地,
    CASE WHEN (GROUPING(产地) = 1) THEN '总计' WHEN (GROUPING(水果) = 1) THEN '小计' WHEN (GROUPING(水果) = 1) THEN '总计'
                ELSE ISNULL(水果, 'UNKNOWN')
           END AS 产地,
    sum(重量) 总重量 from tt group by 产地,水果 with rollup 
    产地       产地       总重量         
    -------- -------- ----------- 
    北方       桔子       8
    北方       水蜜桃      7
    北方       香蕉       3
    北方       小计       18
    南方       桔子       3
    南方       水蜜桃      6
    南方       香蕉       3
    南方       小计       12
    总计       总计       30(所影响的行数为 9 行)
      

  8.   

    用到分组子句中的 with rollup后,sql会给结果集添加一些分组行,而这些行都有用一个grouping函数来找到,grouping(字段名)函数如果返回1则说明此行记录是由sql自动添加的统计记录,如果返回0则是正常记录。了解了这个原理那么楼主的想法就好实现了,代码如下:
    create table tt 
    (产地 char(8),水果 char(8),重量 int  ) 
    insert tt values('北方','香蕉',3) 
    insert tt values('北方','水蜜桃',2) 
    insert tt values('南方','桔子',3) 
    insert tt values('北方','水蜜桃',5) 
    insert tt values('南方','香蕉',3) 
    insert tt values('南方','水蜜桃',6) 
    insert tt values('北方','桔子',8)
    select 
      CASE WHEN (GROUPING(产地) = 1) THEN '总计' ELSE 产地 END AS '产地',
      CASE WHEN (GROUPING(水果) = 1) THEN '小计' ELSE 水果 END AS '水果',
      sum(重量) 总重量 
    from 
      tt 
    group by 
      产地,水果 with rollup 
      

  9.   

    select CASE WHEN (GROUPING(产地) = 1) THEN '总计' ELSE ISNULL(产地, 'UNKNOWN') END AS 产地, CASE WHEN (GROUPING(产地) = 1) THEN '总计' WHEN (GROUPING(水果) = 1) THEN '小计' WHEN (GROUPING(水果) = 1) THEN '总计' ELSE ISNULL(水果, 'UNKNOWN') END AS 产地,
    sum(重量) 总重量 
    from tb 
    group by 产地,水果 with rollup 
      

  10.   

    感谢各位高手!!综合你们的帖子,我总结出最佳答案:即:
    select * from (
    select 产地,水果,sum(重量) 总重量 from tt group by 产地,水果
    union all
    select 产地,  '小计' as 水果,sum(重量) 总重量 from tt group by 产地
    union all
    select  '总计','总计',sum(重量) 总重量 from tt 
    )tt
    order by 产地,charindex('小计',水果)