以下问题,一人全部对,分数只给一人,没有全对的按先后顺序给分
已有成绩表如下图,看不到请刷新:
http://p.blog.csdn.net/images/p_blog_csdn_net/thinclient/420223/o_%e6%9c%aa%e5%91%bd%e5%90%8d.bmp
定义:
名次以1开始,两人总分相同,名次应相同,如下所示:
名次   分数
1      333
2      222
2      222
4      111
总分1=语文+数学
总分2=语文+数学+政治
总名次1:所有考生的排名:按总分1排序
校名次1:以“单位”分组的内部名次:按总分1排序
总名次2:所有考生的排名:按总分2排序
校名次2:以“单位”分组的内部名次:按总分2排序
总分和总名次和校名次原表中没有,须在查询中生成任务一:从成绩表查询出下表
总名次1,校名次1,总名次2,校名次2,考场,考号,单位,姓名,性别,语文,数学,物理,化学,外语,政治
.
.
.
任务二:从成绩表查询出下表:(0分者不计为分母)
单位,语文平均,数学平均,物理平均,化学平均,外语平均,政治平均
单位1
单位2
.
.
.
全部单位
任务三:从成绩表查询出下表:(>=60为及格)
单位,语文及格率,数学及格率,物理及格率,化学及格率,外语及格率,政治及格率
单位1
单位2
.
.
.
全部单位

解决方案 »

  1.   

    实际上语句不难,
    只是数据太多,难得输入,
    思路:
    主要使用ROW_NUMBER, DENSE_RANK, PARTITION BY ,ORDER BY SUM这几个而已,
      

  2.   

    不需要写建立数据的语句,只写tsql能产生正确结果就成
      

  3.   

    由于问题较多,我另发一帖给分,帖名为:求sql server 2005 tsql 学生成绩
    任务四:从成绩表查询出下表
    定义:[段700]是总分1大于等于700的该校学生人数,[段600]是总分1大于等于600且小于700的该校学生人数……,[段0]是总分1大于0且小于300的该校学生人数,[全部单位]含所有学校的学生人数.
    对列要求使用动态sql,因为实际中分段是10分一段的。
    单位      段700 段600  段500  段400 段300 段0
    单位1 
    单位2 



    全部单位 
      

  4.   


    drop table score;--Test dataCreate table score(
    考号 char(6),
    考场 char(2),
    单位 varchar(20),
    总名次 integer,
    校名次 integer,
    姓名 varchar(10),
    性别 varchar(2),
    语文 numeric(5,1),
    数学 numeric(5,1),
    物理 numeric(5,1),
    化学 numeric(5,1),
    外语 numeric(5,1),
    政治 numeric(5,1)
    );
    goInsert into score values('040001', '1', 'shihe', 964, 219, 'dong', '女', 43.0, 13.0, 1.0, 2.0, 1.0, 1.0);
    Insert into score values('040002', '1', 'hailin', 964, 219, 'zhao', '男', 3.0, 23.0, 91.0, 2.0, 1.0, 1.0);
    Insert into score values('040003', '1', 'shihe', 964, 219, 'qian', '女', 23.0, 33.0, 1.0, 2.0, 1.0, 11.0);
    Insert into score values('040004', '1', 'xinhe', 964, 219, 'sun', '男', 63.0, 43.0, 1.0, 2.0, 51.0, 1.0);
    Insert into score values('040005', '1', 'shihe', 964, 219, 'li', '女', 93.0, 53.0, 1.0, 62.0, 1.0, 1.0);
    Insert into score values('040006', '1', 'hailin', 964, 219, 'zhou', '女', 13.0, 63.0, 81.0, 2.0, 1.0, 1.0);
    Insert into score values('040007', '1', 'shihe', 964, 219, 'wu', '女', 3.0, 73.0, 1.0, 62.0, 31.0, 21.0);-- End of test data-- Task 1select rank() over (order by 语文+数学) as 总名次1, 
    rank() over (partition by 单位 order by 语文+数学) as 校名次1,
    rank() over (order by 语文+数学+政治) as 总名次2,
    rank() over (partition by 单位 order by 语文+数学+政治 ) 校名次2,
      考场,考号,单位,姓名,性别,语文,数学,物理,化学,外语,政治 
    from score ts;-- Task 2select 单位,
    avg(语文) as  语文平均,
    avg(数学) as 数学平均,
    avg(物理) as 物理平均,
    avg(化学) as 化学平均,
    avg(外语) as 外语平均,
    avg(政治) as 政治平均 
    from score
    group by 单位;-- task 3
    select 单位,
    cast( sum( case when 语文>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 语文及格率,
    cast( sum( case when 数学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 数学及格率,
    cast( sum( case when 物理>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 物理及格率,
    cast( sum( case when 化学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 化学及格率,
    cast( sum( case when 外语>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 外语及格率,
    cast( sum( case when 政治>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 政治及格率 
    from score
    group by 单位;
      

  5.   


    drop table score;--Test dataCreate table score(
    考号 char(6),
    考场 char(2),
    单位 varchar(20),
    总名次 integer,
    校名次 integer,
    姓名 varchar(10),
    性别 varchar(2),
    语文 numeric(5,1),
    数学 numeric(5,1),
    物理 numeric(5,1),
    化学 numeric(5,1),
    外语 numeric(5,1),
    政治 numeric(5,1)
    );
    goInsert into score values('040001', '1', 'shihe', 964, 219, 'dong', '女', 43.0, 13.0, 1.0, 2.0, 1.0, 1.0);
    Insert into score values('040002', '1', 'hailin', 964, 219, 'zhao', '男', 3.0, 23.0, 91.0, 2.0, 1.0, 1.0);
    Insert into score values('040003', '1', 'shihe', 964, 219, 'qian', '女', 23.0, 33.0, 1.0, 2.0, 1.0, 11.0);
    Insert into score values('040004', '1', 'xinhe', 964, 219, 'sun', '男', 63.0, 43.0, 1.0, 2.0, 51.0, 1.0);
    Insert into score values('040005', '1', 'shihe', 964, 219, 'li', '女', 93.0, 53.0, 1.0, 62.0, 1.0, 1.0);
    Insert into score values('040006', '1', 'hailin', 964, 219, 'zhou', '女', 13.0, 63.0, 81.0, 2.0, 1.0, 1.0);
    Insert into score values('040007', '1', 'shihe', 964, 219, 'wu', '女', 3.0, 73.0, 1.0, 62.0, 31.0, 21.0);-- End of test data-- Task 1select rank() over (order by 语文+数学) as 总名次1, 
    rank() over (partition by 单位 order by 语文+数学) as 校名次1,
    rank() over (order by 语文+数学+政治) as 总名次2,
    rank() over (partition by 单位 order by 语文+数学+政治 ) 校名次2,
      考场,考号,单位,姓名,性别,语文,数学,物理,化学,外语,政治 
    from score ts;-- Task 2select 单位,
    avg(语文) as  语文平均,
    avg(数学) as 数学平均,
    avg(物理) as 物理平均,
    avg(化学) as 化学平均,
    avg(外语) as 外语平均,
    avg(政治) as 政治平均 
    from score
    group by 单位;-- task 3
    select 单位,
    cast( sum( case when 语文>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 语文及格率,
    cast( sum( case when 数学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 数学及格率,
    cast( sum( case when 物理>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 物理及格率,
    cast( sum( case when 化学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 化学及格率,
    cast( sum( case when 外语>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 外语及格率,
    cast( sum( case when 政治>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 政治及格率 
    from score
    group by 单位;-- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @mk intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @kk = cast(@maxscore/@interval as int)select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>' + 
    cast(@maxscore as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@kk>0)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学 between ' + 
    cast(@maxscore as varchar) + ' and ' + 
    cast(@maxscore+@interval as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    set @kk=@kk-1
    end
    set @execsql = @execsql + N' from score group by 单位'exec(@execsql)
      

  6.   

    任务4 有一点问题,用下面这个
    -- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @mk intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @kk = cast(@maxscore/@interval as int)select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
    cast(@maxscore as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@kk>0)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
    cast(@maxscore as varchar) + N' and 语文+数学< ' + 
    cast(@maxscore+@interval as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    set @kk=@kk-1
    end
    set @execsql = @execsql + N' from score group by 单位'exec(@execsql)
      

  7.   

    task 4 中需要体现对最低分(300)的处理,0到最低分之间算做一个段(0<语文+数学<300,没等号)
      

  8.   

    试试这个
    drop table score;--Test dataCreate table score(
    考号 char(6),
    考场 char(2),
    单位 varchar(20),
    总名次 integer,
    校名次 integer,
    姓名 varchar(10),
    性别 varchar(2),
    语文 numeric(5,1),
    数学 numeric(5,1),
    物理 numeric(5,1),
    化学 numeric(5,1),
    外语 numeric(5,1),
    政治 numeric(5,1)
    );
    goInsert into score values('040001', '1', 'shihe', 964, 219, 'dong', '女', 43.0, 13.0, 1.0, 2.0, 1.0, 1.0);
    Insert into score values('040002', '1', 'hailin', 964, 219, 'zhao', '男', 3.0, 23.0, 91.0, 2.0, 1.0, 1.0);
    Insert into score values('040003', '1', 'shihe', 964, 219, 'qian', '女', 23.0, 33.0, 1.0, 2.0, 1.0, 11.0);
    Insert into score values('040004', '1', 'xinhe', 964, 219, 'sun', '男', 63.0, 43.0, 1.0, 2.0, 51.0, 1.0);
    Insert into score values('040005', '1', 'shihe', 964, 219, 'li', '女', 93.0, 53.0, 1.0, 62.0, 1.0, 1.0);
    Insert into score values('040006', '1', 'hailin', 964, 219, 'zhou', '女', 13.0, 63.0, 81.0, 2.0, 1.0, 1.0);
    Insert into score values('040007', '1', 'shihe', 964, 219, 'wu', '女', 3.0, 73.0, 1.0, 62.0, 31.0, 21.0);-- End of test data-- Task 1select rank() over (order by 语文+数学) as 总名次1, 
    rank() over (partition by 单位 order by 语文+数学) as 校名次1,
    rank() over (order by 语文+数学+政治) as 总名次2,
    rank() over (partition by 单位 order by 语文+数学+政治 ) 校名次2,
      考场,考号,单位,姓名,性别,语文,数学,物理,化学,外语,政治 
    from score ts;-- Task 2select 单位,
    avg(语文) as  语文平均,
    avg(数学) as 数学平均,
    avg(物理) as 物理平均,
    avg(化学) as 化学平均,
    avg(外语) as 外语平均,
    avg(政治) as 政治平均 
    from score
    group by 单位;-- task 3
    select 单位,
    cast( sum( case when 语文>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 语文及格率,
    cast( sum( case when 数学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 数学及格率,
    cast( sum( case when 物理>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 物理及格率,
    cast( sum( case when 化学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 化学及格率,
    cast( sum( case when 外语>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 外语及格率,
    cast( sum( case when 政治>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 政治及格率 
    from score
    group by 单位;-- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @minscore intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @minscore = 300 --分数最低档select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
    cast(@maxscore as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@maxscore>@minscore)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
    cast(@maxscore as varchar) + N' and 语文+数学< ' + 
    cast(@maxscore+@interval as varchar) + 
    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学<' + 
    cast(@minscore as varchar) + N' and 语文+数学>0 ' + 
    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from score group by 单位'exec(@execsql)
      

  9.   

    非常感谢,等我测试以下所有的代码
    另外如果您有兴趣,请看一下这个帖子,一直没人回答:
    http://topic.csdn.net/u/20080630/09/46526a1b-639c-4e82-b5b1-e4dc5809a496.html
      

  10.   

    对于task 4,能不能加点代码,使查询出的最后一行是所有单位的“段”人数?就是最后一行是上面所有行的累加?
      

  11.   


    -- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @minscore intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @minscore = 300 --分数最低档select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@maxscore>@minscore)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + N' and 语文+数学< ' + 
                    cast(@maxscore+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学<' + 
                    cast(@minscore as varchar) + N' and 语文+数学>0 ' + 
                    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from score group by 单位 with rollup'exec(@execsql)
      

  12.   

    稍微改了点,看起来好看点
    -- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @minscore intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @minscore = 300 --分数最低档select @execsql = N'select (case grouping(单位) when 0 then 单位 else N''全部'' end) as 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@maxscore>@minscore)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + N' and 语文+数学< ' + 
                    cast(@maxscore+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学<' + 
                    cast(@minscore as varchar) + N' and 语文+数学>0 ' + 
                    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from score group by 单位 with rollup'exec(@execsql)
      

  13.   


    那是因为我在这个例子里给的分数都属于段0!!
    试试
    drop table score;--Test dataCreate table score(
        考号 char(6),
        考场 char(2),
        单位 varchar(20),
        总名次 integer,
        校名次 integer,
        姓名 varchar(10),
        性别 varchar(2),
        语文 numeric(5,1),
        数学 numeric(5,1),
        物理 numeric(5,1),
        化学 numeric(5,1),
        外语 numeric(5,1),
        政治 numeric(5,1)
    );
    goInsert into score values('040001', '1', 'shihe', 964, 219, 'dong', '女', 143.0, 113.0, 101.0, 102.0, 101.0, 101.0);
    Insert into score values('040002', '1', 'hailin', 964, 219, 'zhao', '男', 203.0, 223.0, 291.0, 202.0, 101.0, 101.0);
    Insert into score values('040003', '1', 'shihe', 964, 219, 'qian', '女', 123.0, 133.0, 101.0, 102.0, 101.0, 111.0);
    Insert into score values('040004', '1', 'xinhe', 964, 219, 'sun', '男', 563.0, 43.0, 1.0, 2.0, 51.0, 1.0);
    Insert into score values('040005', '1', 'shihe', 964, 219, 'li', '女', 393.0, 253.0, 1.0, 62.0, 1.0, 1.0);
    Insert into score values('040006', '1', 'hailin', 964, 219, 'zhou', '女', 13.0, 63.0, 81.0, 2.0, 1.0, 1.0);
    Insert into score values('040007', '1', 'shihe', 964, 219, 'wu', '女', 3.0, 73.0, 1.0, 62.0, 31.0, 21.0);-- End of test data-- Task 1select rank() over (order by 语文+数学) as 总名次1, 
        rank() over (partition by 单位 order by 语文+数学) as 校名次1,
        rank() over (order by 语文+数学+政治) as 总名次2,
        rank() over (partition by 单位 order by 语文+数学+政治 ) 校名次2,
      考场,考号,单位,姓名,性别,语文,数学,物理,化学,外语,政治 
    from score ts;-- Task 2select 单位,
        avg(语文) as  语文平均,
        avg(数学) as 数学平均,
        avg(物理) as 物理平均,
        avg(化学) as 化学平均,
        avg(外语) as 外语平均,
        avg(政治) as 政治平均 
    from score
    group by 单位;-- task 3
    select 单位,
        cast( sum( case when 语文>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 语文及格率,
        cast( sum( case when 数学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 数学及格率,
        cast( sum( case when 物理>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 物理及格率,
        cast( sum( case when 化学>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 化学及格率,
        cast( sum( case when 外语>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 外语及格率,
        cast( sum( case when 政治>=60.0 then 1 else 0 end ) as float)/ cast(count(*) as float) as 政治及格率 
    from score
    group by 单位;-- Task 4declare @execsql nvarchar(4000), @maxscore int, @interval float, @kk int, @minscore intset @interval = 100 --设置间隔
    set @maxscore = 700 --分数最高档
    set @minscore = 300 --分数最低档select @execsql = N'select (case grouping(单位) when 0 then 单位 else N''全部'' end) as 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)while(@maxscore>@minscore)
    begin
    set @maxscore = @maxscore - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxscore as varchar) + N' and 语文+数学< ' + 
                    cast(@maxscore+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxscore as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学<' + 
                    cast(@minscore as varchar) + N' and 语文+数学>0 ' + 
                    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from score group by 单位 with rollup'exec(@execsql)
      

  14.   

    不是的
    我早上运行时已把你的代码改下如下,没有带你的数据,是用的自己的真实中考成绩:(我只是把数据库名为zk,表名也为zk),所以应该还是有问题,你的这最后一帖不知道是不是修正了错误。
    use zk
    declare @execsql nvarchar(4000), @maxaaa int, @interval float, @kk int, @minaaa intset @interval = 10 --设置间隔
    set @maxaaa = 700 --分数最高档
    set @minaaa = 300 --分数最低档select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxaaa as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar)while(@maxaaa>@minaaa)
    begin
    set @maxaaa = @maxaaa - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学>=' + 
                    cast(@maxaaa as varchar) + N' and 语文+数学< ' + 
                    cast(@maxaaa+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学<' + 
                    cast(@minaaa as varchar) + N' and 语文+数学>0 ' + 
                    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from zk group by 单位'exec(@execsql)
      

  15.   

    我改后的完整代码如下,请注意红色:
    use zk
    declare @execsql nvarchar(4000), @maxaaa int, @interval float, @kk int, @minaaa intset @interval = 10 --设置间隔
    set @maxaaa = 700 --分数最高档
    set @minaaa = 300 --分数最低档select @execsql = N'select 单位'
    set @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2>=' + 
                    cast(@maxaaa as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar)while(@maxaaa>@minaaa)
    begin
    set @maxaaa = @maxaaa - @interval
    set @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2>=' + 
                    cast(@maxaaa as varchar) + N' and 语文+数学+物理+化学+外语+政治+历史*0.2< ' + 
                    cast(@maxaaa+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar)
    endset @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2<' + 
                    cast(@minaaa as varchar) + N' and 语文+数学+物理+化学+外语+政治+历史*0.2>0 ' + 
                    N' then 1 else 0 end) as 段0'set @execsql = @execsql + N' from zk group by 单位'exec(@execsql)
      

  16.   

    eru 大侠
    我对你的代码改后的完整代码如下,请注意红色: 
    这段运行时出错:消息 102,级别 15,状态 1,第 1 行 '+' 附近有语法错误。
    use zk 
    declare @execsql nvarchar(4000), @maxaaa int, @interval float, @kk int, @minaaa int set @interval = 10 --设置间隔 
    set @maxaaa = 700 --分数最高档 
    set @minaaa = 300 --分数最低档 select @execsql = N'select 单位' 
    set @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2>=' + 
                    cast(@maxaaa as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar) while(@maxaaa>@minaaa) 
    begin 
    set @maxaaa = @maxaaa - @interval 
    set @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2>=' + 
                    cast(@maxaaa as varchar) + N' and 语文+数学+物理+化学+外语+政治+历史*0.2 < ' + 
                    cast(@maxaaa+@interval as varchar) + 
                    N' then 1 else 0 end) as 段' + cast(@maxaaa as varchar) 
    end set @execsql = @execsql + N', sum( case when 语文+数学+物理+化学+外语+政治+历史*0.2 <' + 
                    cast(@minaaa as varchar) + N' and 语文+数学+物理+化学+外语+政治+历史*0.2>0 ' + 
                    N' then 1 else 0 end) as 段0' set @execsql = @execsql + N' from zk group by 单位' exec(@execsql) 
      

  17.   

    我的表中有历史
    好像harry回的有道理:动态sql不支持这么长的,如果是这样的话,怎么办呢?
      

  18.   

    把declare那句换成下面这个declare @execsql nvarchar(max), @maxaaa  int, @interval float, @kk int, @minaaa  int
      

  19.   

    好,终于解决了
    很不好意思,eru, 非常感谢您
    本来对这几个sql还有些别的小要求
    但是我的要求太多了
    我得结帖,另帖发问了,望还能继续帮助我