SQL greenhand记录学生上学期和下学期考数学的成绩情况
有biao y08s和y08x
字段有
id date sname math   记录学生08年上学期数学成绩情况
我写的
select sum(case when math>90 then 1 else 0)as mgood,sname,sum(math) as mathsum,count(id) as kscs,avg(math)  from y081  如果要统计学生08年上学期和下学期总的数学成绩情况,要怎么写呢,写了几次都出错请教各位大虾

解决方案 »

  1.   

    select case when 可以用count
    再where中增加条件PS:顺便说明白一下意思
      

  2.   

    语句
    UNION ALL 
    语句请贴出你最终想要的格式,有测试数据最好.
      

  3.   

    表y08s 记得是学生08年上学期考试情况
    id  date   sname  math 
    1 3月5日  陈斌  80
    2 3月15日 陈斌  87
    3 3月25日 陈斌  92表y08x 记得是学生08年下学期考试情况
    id  date   sname  math 
    1 4月3日  陈斌   77
    2 4月12日 陈斌   95
    3 4月22日 陈斌   79
    统计学生08年上学期数学成绩情况  数学考试优秀>90的次数,考试总的次数,平均分
    select sname, sum(case when math>90 then 1 else 0)as mgood,count(id) as kscs,avg(math)  from y08s如果统计学生08全年数学成绩情况  数学考试优秀>90的次数,考试总的次数,平均分
    ?
      
      

  4.   


    首先创建测试表、添加数据。 
    create table #t(a int,b int,c int,d int,e int) 
    insert into #t values(1,2,3,4,5) 
    insert into #t values(1,2,3,4,6) 
    insert into #t values(1,2,3,4,7) 
    insert into #t values(1,2,3,4,8) 
    insert into #t values(1,3,3,4,5) 
    insert into #t values(1,3,3,4,6) 
    insert into #t values(1,3,3,4,8) 
    insert into #t values(1,3,3,4,7) insert into #t values(2,2,2,4,5) 
    insert into #t values(2,2,3,4,6) 
    insert into #t values(2,2,4,4,7) 
    insert into #t values(2,2,5,4,8) 
    insert into #t values(2,3,6,4,5) 
    insert into #t values(2,3,3,4,6) 
    insert into #t values(2,3,3,4,8) 
    insert into #t values(2,3,3,4,7)
    情况一:只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可。 
    select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, 
    sum(b),sum(c),sum(d),sum(e) from #t group by a with rollup 
    情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。 
    select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b, 
    sum(c),sum(d),sum(e) from #t 
    group by a,b with rollup 
    having grouping(b)=0 or grouping(a)=1select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b, c, 
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(c)=0 or grouping(a)=1 
    情况三:有多个分类汇总列,需要全部的小计和合计。 
    select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, 
        case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b, 
        case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end c, 
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    另外一种显示小计的方式 
    select case when grouping(a)=1 then '合计' 
        when grouping(b)=1 then cast(a as varchar)+'小计' 
        else cast(a as varchar) end a, 
        case when grouping(b)=0 and grouping(c)=1 
        then cast(b as varchar)+'小计' else cast(b as varchar) end b, 
        case when grouping(c)=1 and grouping(b)=0 
        then '' else cast(c as varchar) end c, 
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    情况四:有多个分类汇总列,需要部分的小计和合计 
    select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, b, 
        case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end c, 
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(a)=1 or grouping(b)=0 
    select case when grouping(a)=1 then '合计' else cast(a as varchar) end a, 
        case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b, c, 
    sum(d),sum(e) from #t 
    group by a,b,c with rollup 
    having grouping(a)=1 or grouping(b)=1 or grouping(c)=1
      

  5.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2009-09-03 19:50:10
    -- Verstion:
    --      Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
    -- Nov 24 2008 13:01:59 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([姓名] varchar(4),[学期] int,[语文] int,[数学] int,[英语] int,[政治] int)
    insert [tb]
    select '张三',1,70,60,80,30 union all
    select '张三',2,80,90,75,40 union all
    select '张三',3,50,70,85,60 union all
    select '李四',1,66,80,90,55 union all
    select '李四',2,75,70,85,65
    --------------开始查询--------------------------
    select 
        case when grouping(姓名)=1 then '合计' else cast(姓名 as varchar) end 姓名, 
        case when grouping(学期)=1 and grouping(姓名)=0 then '小计' else cast(学期 as varchar) end 学期, 
        sum(语文) as 语文,sum(数学) as 数学,sum(英语) as 英语,sum(政治) as 政治
    from 
       tb 
    group by 
       姓名,学期 
    with rollup ------------------------------------------------------结果-------------------------------------------------------
    /*姓名                             学期                             语文          数学          英语          政治
    ------------------------------ ------------------------------ ----------- ----------- ----------- -----------
    李四                             1                              66          80          90          55
    李四                             2                              75          70          85          65
    李四                             小计                             141         150         175         120
    张三                             1                              70          60          80          30
    张三                             2                              80          90          75          40
    张三                             3                              50          70          85          60
    张三                             小计                             200         220         240         130
    合计                             NULL                           341         370         415         250(8 行受影响)
     */
      

  6.   


    如果统计学生08全年数学成绩情况  数学考试优秀>90的次数,考试总的次数,平均分select sname, sum(case when math>90 then 1 else 0)as mgood,count(id) as kscs,avg(math)  from 
    (select * from y08s union select * from y08x ) 
      

  7.   

    9楼比较直白,看懂了,但运行结果是
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21' 
    ODBC 驱动程序不支持所需的属性。 8楼,看不是很懂,好像讲到其他问题了,主要是我是green hand
      

  8.   

    case when then end.  解
      

  9.   


    CREATE TABLE y08s (id INT,date VARCHAR(10),sname VARCHAR(10),math INT)
    GO
    INSERT INTO y08s VALUES(1,'3月5日' ,'陈斌',80)
    INSERT INTO y08s VALUES(2,'3月15日','陈斌',87)
    INSERT INTO y08s VALUES(3,'3月25日','陈斌',92)
    GO
    CREATE TABLE y08x (id INT,date VARCHAR(10),sname VARCHAR(10),math INT)
    GO
    INSERT INTO y08x VALUES(1,'4月3日' ,'陈斌',77)
    INSERT INTO y08x VALUES(2,'4月12日','陈斌',95)
    INSERT INTO y08x VALUES(3,'4月22日','陈斌',79)
    GO-- 上半年
    SELECT sname
          ,SUM(CASE WHEN math > 90 THEN 1 ELSE 0 END)AS mgood
          ,COUNT(sname) AS kscs
          ,AVG(math)AS Average
      FROM y08s 
     GROUP BY sname
     
     -- 全年
     SELECT sname
          ,SUM(CASE WHEN math > 90 THEN 1 ELSE 0 END)AS mgood
          ,COUNT(sname) AS kscs
          ,AVG(math)AS Average
      FROM (SELECT sname,math FROM y08s UNION ALL SELECT sname,math FROM y08x)X
     GROUP BY sname
      

  10.   

    不明白
    X
     GROUP BY sname 什么意思
    去掉X,输入不行
    出同样错
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e21' 
    ODBC 驱动程序不支持所需的属性。
      

  11.   


    Student(S#,Sname,Sage,Ssex) 学生表 
    Course(C#,Cname,T#) 课程表 
    SC(S#,C#,score) 成绩表 
    Teacher(T#,Tname) 教师表 问题: 
    1、查询“001”课程比“002”课程成绩高的所有学生的学号; 
      select a.S# from (select s#,score from SC where C#='001') a,(select s#,score 
      from SC where C#='002') b 
      where a.score>b.score and a.s#=b.s#; 
    2、查询平均成绩大于60分的同学的学号和平均成绩; 
        select S#,avg(score) 
        from sc 
        group by S# having avg(score) >60; 
    3、查询所有同学的学号、姓名、选课数、总成绩; 
      select Student.S#,Student.Sname,count(SC.C#),sum(score) 
      from Student left Outer join SC on Student.S#=SC.S# 
      group by Student.S#,Sname 
    4、查询姓“李”的老师的个数; 
      select count(distinct(Tname)) 
      from Teacher 
      where Tname like '李%'; 
    5、查询没学过“叶平”老师课的同学的学号、姓名; 
        select Student.S#,Student.Sname 
        from Student  
        where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平'); 
    6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; 
      select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 
    7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; 
      select S#,Sname 
      from Student 
      where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='叶平')); 
    8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; 
      Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 
      from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 
    9、查询所有课程成绩小于60分的同学的学号、姓名; 
      select S#,Sname 
      from Student 
      where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 
    10、查询没有学全所有课的同学的学号、姓名; 
        select Student.S#,Student.Sname 
        from Student,SC 
        where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 
    11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名; 
        select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; 
    12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名; 
        select distinct SC.S#,Sname 
        from Student,SC 
        where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 
    13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; 
        update SC set score=(select avg(SC_2.score) 
        from SC SC_2 
        where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平'); 
    14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名; 
        select S# from SC where C# in (select C# from SC where S#='1002') 
        group by S# having count(*)=(select count(*) from SC where S#='1002'); 
    15、删除学习“叶平”老师课的SC表记录; 
        Delect SC 
        from course ,Teacher  
        where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平'; 
    16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、 
        号课的平均成绩; 
        Insert SC select S#,'002',(Select avg(score) 
        from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 
    17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分 
        SELECT S# as 学生ID 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理 
            ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语 
            ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩 
        FROM SC AS t 
        GROUP BY S# 
        ORDER BY avg(t.score)  
    18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分 
        SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分 
        FROM SC L ,SC AS R 
        WHERE L.C# = R.C# and 
            L.score = (SELECT MAX(IL.score) 
                          FROM SC AS IL,Student AS IM 
                          WHERE L.C# = IL.C# and IM.S#=IL.S# 
                          GROUP BY IL.C#) 
            AND 
            R.Score = (SELECT MIN(IR.score) 
                          FROM SC AS IR 
                          WHERE R.C# = IR.C# 
                      GROUP BY IR.C# 
                        ); 
    19、按各科平均成绩从低到高和及格率的百分数从高到低顺序 
        SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩 
            ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数 
        FROM SC T,Course 
        where t.C#=course.C# 
        GROUP BY t.C# 
        ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC 
    20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004) 
        SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分 
            ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数 
            ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分 
            ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数 
            ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分 
            ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数 
            ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分 
            ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数 
      FROM SC