有一张表 Tscore:
id 姓名      语文
1  张三      70
2  李四      80
3  王二麻子  90我做了一个视图,每次需要显示的是在这张表的最后加上一行,写上:
   总计      240
总计和姓名对齐,240在语文列。
现在我用
select id,姓名,语文 from Tscore
union
select '','总计',sum(语文) from Tscore order by 语文一般是可以把总计这一行置底,但是遇到其他人成绩都是0分,只有一个人有成绩,那么这个总计就跑到当中去了,请问有什么办法吗?

解决方案 »

  1.   

    SELECT * FROM 
    (select id,姓名,语文 from Tscore
    union
    select '','总计',sum(语文) from Tscore order by 语文 )
    ORDER BY CASE  姓名 WHEN '总计' THEN 1 ELSE 0 END
      

  2.   

    select id,姓名,语文 from Tscore 
    union 
    select '','总计',sum(语文) from Tscore 
    order by 
      case when  姓名='总计' then 1 else 2 end,
      语文
      

  3.   

    倒过来了
    select id,姓名,语文 from Tscore 
    union 
    select '','总计',sum(语文) from Tscore 
    order by 
      case when  姓名='总计' then 2 else 1 end,
      语文
      

  4.   


    /*---------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2009-09-13 22:07:27
    --  Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    Mar 29 2009 10:27:29 
    Copyright (c) 1988-2008 Microsoft Corporation
    Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
    --> 生成测试数据表:TscoreIF NOT OBJECT_ID('[Tscore]') IS NULL
    DROP TABLE [Tscore]
    GO
    CREATE TABLE [Tscore]([id] INT,[姓名] NVARCHAR(10),[语文] INT)
    INSERT [Tscore]
    SELECT 1,N'张三',0 UNION ALL
    SELECT 2,N'李四',80 UNION ALL
    SELECT 3,N'王五',0 UNION ALL
    SELECT 4,N'王二麻子',0
    GO
    --SELECT * FROM [Tscore]-->SQL查询如下:
    select id,姓名,语文 from Tscore 
    union 
    select '','总计',sum(语文) from Tscore order by 语文
    /*
    id          姓名         语文
    ----------- ---------- -----------
    1           张三         0
    3           王五         0
    4           王二麻子       0
    0           总计         80
    2           李四         80
    */select id,姓名,语文,px=0 from Tscore 
    union all
    select '','总计',sum(语文),px=1 from Tscore order by 语文,px
    /*
    id          姓名         语文          px
    ----------- ---------- ----------- -----------
    1           张三         0           0
    3           王五         0           0
    4           王二麻子       0           0
    2           李四         80          0
    0           总计         80          1
    */
      

  5.   

    IF OBJECT_ID('Tscore') IS NOT NULL DROP TABLE Tscore
    GO
    CREATE TABLE Tscore(ID VARCHAR(20) ,姓名 VARCHAR(50),语文 INT)
    INSERT INTO Tscore
    SELECT 1,'张三',      70 UNION ALL
    SELECT 2,'李四',      80 UNION ALL
    SELECT 3,'王二麻子',  90 SELECT * FROM 
    (select id,姓名,语文 from Tscore
    union
    select '','总计',sum(语文) from Tscore  ) T
    ORDER BY CASE  姓名 WHEN '总计' THEN 1 ELSE 0 END/*
    1 张三 70
    2 李四 80
    3 王二麻子 90
    总计 240
    */
      

  6.   

    而且你可以看看
    with rollup /cube
      

  7.   

    我一直想知道with rollup的实现原理是什么
      

  8.   


    那就向12楼的MVP发帖提问..
      

  9.   

    是类似于UNION ALL +SELECT SUM()还是在逐条读结果集的时候就开始累加了