select 课程名,
sum(case when 分数 between 0 and 60 then 分数 else 0 end) as '0-60分',
sum(case when 分数 between 0 and 60 then 分数 else 0 end) as '0-60分',
sum(case when 分数 between 0 and 60 then 分数 else 0 end) as '0-60分',
sum(case when 分数 between 0 and 60 then 分数 else 0 end) as '0-60分'
from 表
where 课程名='语文'
group by 课程名
分数自己添

解决方案 »

  1.   

    CREATE TABLE Rank(
    division CHAR(20),
    number INT);CREATE PROC statistic_(name CHAR(20))
    AS
    DECLARE
    less60 int := 0; //分为五个分数段,并置初始值为0
    b60a70 int := 0;
    b70a80 int := 0;
    b80a90 int := 0;
    more90 int := 0;
    curcno CHAR(4); --设字符型变量curcno 存放输入的课程名称参数
    BEGIN
    SELECT 课程号 INTO curcno --根据课程名称在Course 表中查询查询该课程号
    FROM 课程表
    WHERE 课程名 = name;
    IF NOT FOUND THEN --如果不存在用户输入的课程名称,返回错误信息
    RAISE EXCEPTION '输入错误,没有该课程';
    END IF;
    SELECT count(*) INTO less60 --查询分数低于60 分的学生人数
    FROM 成绩表
    WHERE 课程号 = curcno AND 成绩< 60;
    SELECT count(*) INTO b60a70 --查询分数在60 到70 之间的学生人数
    FROM 成绩表
    WHERE 课程号 = curcno AND 成绩 >= 60 AND 成绩< 70;
    SELECT count(*) INTO b70a80 --查询分数在70 到80 之间的学生人数
    FROM 成绩表
    WHERE 课程号 = curcno AND 成绩 >= 70 AND 成绩 < 80;
    SELECT count(*) INTO b80a90 --查询分数在80 到90 之间的学生人数
    FROM 成绩表
    WHERE 课程号 = curcno AND 成绩 >= 80 AND 成绩 < 90;
    SELECT count(*) INTO more90 --查询分数高于90 的学生人数
    FROM 成绩表
    WHERE 课程号 = curcno AND 成绩 >= 90;
    --向表Rank 中插入五条记录,显示成绩分布情况
    INSERT INTO Rank VALUES('[0,60)',less60);
    INSERT INTO Rank VALUES('[60,70)',b60a70);
    INSERT INTO Rank VALUES('[70,80)',b70a80);
    INSERT INTO Rank VALUES('[80,90)',b80a90);
    INSERT INTO Rank VALUES('[90,100]',more90);
    END消息 102,级别 15,状态 1,过程 statistic_,第 1 行
    'name' 附近有语法错误。
    消息 155,级别 15,状态 2,过程 statistic_,第 4 行
    'int' 不是可以识别的 CURSOR 选项。
    消息 4145,级别 15,状态 1,过程 statistic_,第 14 行
    在应使用条件的上下文(在 'THEN' 附近)中指定了非布尔类型的表达式。
    消息 128,级别 15,状态 1,过程 statistic_,第 33 行
    在此上下文中不允许使用名称 "less60"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。
    消息 128,级别 15,状态 1,过程 statistic_,第 34 行
    在此上下文中不允许使用名称 "b60a70"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。
    消息 128,级别 15,状态 1,过程 statistic_,第 35 行
    在此上下文中不允许使用名称 "b70a80"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。
    消息 128,级别 15,状态 1,过程 statistic_,第 36 行
    在此上下文中不允许使用名称 "b80a90"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。
    消息 128,级别 15,状态 1,过程 statistic_,第 37 行
    在此上下文中不允许使用名称 "more90"。有效表达式包括常量、常量表达式和变量(在某些上下文中)。不允许使用列名。出现上面的错误,怎么解决啊
      

  2.   

    接楼上的---测试数据---
    CREATE TABLE 表 (课程名 varchar(20),分数 int)
    insert 表
    select '语文',80 union all
    select '语文',90 union all
    select '语文',50 union all
    select '语文',65 union all
    select '数学',80 union all
    select '数学',95 union all
    select '数学',100 union all
    select '数学',90 ---定义存储过程---
    if object_id('dbo.ScoreProc') is not null
    drop proc dbo.ScoreProc
    GO
    Create proc dbo.ScoreProc @course varchar(50)
    as 
      begin
        select 
          课程名,
          sum(case when 分数 between 0 and 59 then 1 else 0 end) as '60分以下',
          sum(case when 分数 between 60 and 74 then 1 else 0 end) as '60-74分',
          sum(case when 分数 between 75 and 84 then 1 else 0 end) as '75-84分',
          sum(case when 分数 between 85 and 100 then 1 else 0 end) as '85-100分'
        from 表
        where 课程名=@course
        group by 课程名
      end---调用存储过程---
    exec ScoreProc '语文'
    exec ScoreProc '数学'---结果---
    /**
    课程名                  60分以下       60-74分      75-84分      85-100分     
    -------------------- ----------- ----------- ----------- ----------- 
    语文                   1           1           1           1课程名                  60分以下       60-74分      75-84分      85-100分     
    -------------------- ----------- ----------- ----------- ----------- 
    数学                   0           0           1           3
    **/
      

  3.   


    select 课程名称 , 分数 , count(*) from tb group by 课程名称select 课程名称 , 
    sum(case when 分数 between 0  and 59 then 1 else 0 end) as [0-60],
    sum(case when 分数 between 60 and 69 then 1 else 0 end) as [60-70],
    sum(case when 分数 between 70 and 79 then 1 else 0 end) as [70-80],
    sum(case when 分数 between 80 and 89 then 1 else 0 end) as [80-89],
    sum(case when 分数 between 90 and 100 then 1 else 0 end) as [90-100]
    from tb 
    group by 课程名称
      

  4.   

    if object_id('dbo.ScoreProc') is not null
    drop proc dbo.ScoreProc
    GO
    什么作用啊