有下面一张表结构与数据,想得到后面的查询结果,这个SQL如何写?谢谢姓名 课目 成绩
张三 语文 86
张三 英语 85
李四 语文 65
张三 数学 80
李四 数学 78
李四 英语 80
得到结果如下,即分组并且有合计:张三 语文 86
张三 数学 80
张三 英语 85
     合计 251
李四 语文 65
李四 数学 78
李四 英语 80
     合计 223

解决方案 »

  1.   

    select 姓名, 课目, 成绩 from table
    union all
    select 姓名,'合计',sum(成绩) from table group by 姓名 
    这样是否可以?
      

  2.   

    比较笨的办法:alter table table_1 add ls varchar(50)
    go
    update table_1 set ls=姓名
    go
    insert into table_1(姓名,科目,成绩,ls) (select null, '合计',sum(成绩),姓名 from table_1 group by 姓名)
    go
    select 姓名,科目,成绩 from table_1 order by ls,成绩
      

  3.   

    稍微修改下:select * from  (select 姓名, 科目, 成绩 from table_1
    union all
    select 姓名,'合计',sum(成绩) from table_1 group by 姓名)as a order by 姓名,成绩
      

  4.   

    你问错地方了,到SQL板块去问,那里SQL高手超多
    有个GROUPING,你自己搜索下,挺强悍的
    SELECT CASE WHEN (GROUPING([姓名]) = 1) THEN ''
                ELSE ISNULL('', 'UNKNOWN')
           END AS [姓名],
           CASE WHEN (GROUPING([课目]) = 1) THEN ''
                ELSE ISNULL('总计', 'UNKNOWN')
           END AS [课目],
           SUM([成绩]) AS [成绩]
    FROM T_Table1
    GROUP BY [姓名],[课目] WITH ROLLUP
      

  5.   


    CREATE TABLE [T]
    (
    姓名 VARCHAR(10),
    课目 VARCHAR(10),
    成绩 INT
    );
    GO 
    INSERT INTO [T]
    SELECT '张三', '语文', 86 UNION ALL
    SELECT '张三', '英语', 85 UNION ALL
    SELECT '李四', '语文', 65 UNION ALL
    SELECT '张三', '数学', 80 UNION ALL
    SELECT '李四', '数学', 78 UNION ALL
    SELECT '李四', '英语', 80SELECT CASE WHEN A.课目='' THEN '合计' ELSE A.姓名 END AS 姓名,
     课目,成绩  FROM  ( SELECT TOP 100 PERCENT *  FROM 
    (
    SELECT  姓名,课目,成绩 FROM T 
    UNION ALL
    SELECT  A.姓名 ,'' 课目 ,A.成绩 FROM (SELECT 姓名,SUM(成绩) 成绩 FROM T GROUP BY 姓名) A) A
    ORDER BY 姓名 ,课目 DESC 
    ) A
    /*
    姓名         课目         成绩          
    ---------- ---------- ----------- 
    李四         语文         65
    李四         英语         80
    李四         数学         78
    合计                    223
    张三         语文         86
    张三         英语         85
    张三         数学         80
    合计                    251(所影响的行数为 8 行)
    */
      

  6.   

    GROUP BY  WITH ROLLUP
      

  7.   

    太感谢各位了,特别是ForFumm。其实有一种方法是不用Union来实现的,Union其实就多了个查询,这个影响速度性能,那种方法是通过一个语法来实现的,如group by是分组,还有个语法就可以实现我要求的结果,但我一下子想不起来了。
      

  8.   

    xeqtrl982的方法估计可行,过会试下再回来结贴,呵
      

  9.   

    楼上的这段代码是正确的:我也赞同这样写,最后加with rollupSELECT CASE WHEN (GROUPING([姓名]) = 1) THEN ''
      ELSE ISNULL('', 'UNKNOWN')
      END AS [姓名],
      CASE WHEN (GROUPING([课目]) = 1) THEN ''
      ELSE ISNULL('总计', 'UNKNOWN')
      END AS [课目],
      SUM([成绩]) AS [成绩]
    FROM T_Table1
    GROUP BY [姓名],[课目] WITH ROLLUP
      

  10.   


    --借楼上数据一用
    CREATE TABLE [T]
    (
    姓名 VARCHAR(10),
    课目 VARCHAR(10),
    成绩 INT
    );
    GO 
    INSERT INTO [T]
    SELECT '张三', '语文', 86 UNION ALL
    SELECT '张三', '英语', 85 UNION ALL
    SELECT '李四', '语文', 65 UNION ALL
    SELECT '张三', '数学', 80 UNION ALL
    SELECT '李四', '数学', 78 UNION ALL
    SELECT '李四', '英语', 80
    SELECT 姓名,课目,成绩
    FROM t
    ORDER BY 姓名
    COMPUTE SUM(成绩) BY 姓名/*
    姓名         课目         成绩          
    ---------- ---------- ----------- 
    李四         语文         65
    李四         数学         78
    李四         英语         80                      sum
                          ===========
                          223
    姓名         课目         成绩          
    ---------- ---------- ----------- 
    张三         数学         80
    张三         语文         86
    张三         英语         85                      sum
                          ===========
                          251
    (所影响的行数为 8 行)*/
      

  11.   

    SELECT CASE WHEN A.课目='' THEN '合计' ELSE A.姓名 END AS 姓名,
     课目,成绩  FROM  ( SELECT TOP 100 PERCENT *  FROM 
    (
    SELECT  姓名,课目,成绩 FROM T 
    UNION ALL
    SELECT  A.姓名 ,'' 课目 ,A.成绩 FROM (SELECT 姓名,SUM(成绩) 成绩 FROM T GROUP BY 姓名) A) A
    ORDER BY 姓名 ,课目 DESC 
    ) A