create table tbscore
    (
    schoolname varchar(20) ,
    stuname varchar(20),
    coursename varchar(10),
    score int,
    testname varchar(60),
    termname varchar(10)
)insert into tbscore
select '金华四中','s1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
select '金华四中','s2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s5','数学',30,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
select '金华四中','s2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华四中','s5','语文',32,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
select '金华五中','w2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w5','数学',40,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
select '金华五中','w2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
select '金华五中','w5','语文',42,'2009年6月份婺城区初一年级各学校摸底考试','初一'
--------------------------------------------------------------------------------------------
分数段     社会     语文    数学    科学     英语
0-29        0        0       0       0        0
30-39       0        1       1       0        0
40-49       0        1       1       0        0
50-59       0        0       0       0        0
60-69       0        0       0       0        0
70-79       0        0       0       0        0
80-89       0        0       0       0        0
90-99       0        8       8       0        0
100-109     0        0       0       0        0
110-119     0        0       0       0        0 
120-129     0        0       0       0        0
130-139               以下全是0
140-149
150-159
160-169
170-179
180-189
190-200
合计        0        10      10      0        0
-------------------------------------------------------------
                       ↑
               笔算正确结果   每个分数段都是算所有学校的学生加在一起,高手帮忙。分数段是可变的,我传过来一个参数,如果参数=5,就是从0分到200分以5分为一段,如果参数等于10,就是从0分到200分以10分为一段。

解决方案 »

  1.   

    declare @interval intset @interval = 10;with tb as
    (
    select CAST(score - score%@interval AS VARCHAR(10)) + '-' +
           CAST((score - score%@interval) + (@interval -1) AS VARCHAR(10)) as d ,coursename,score
    from tbscore
    )select d,count(case when coursename = '语文' then d end) as  语文,
           count(case when coursename = '语文' then d end) as  数学,
           count(case when coursename = '外语' then d end) as  外语
    from tb
    group by d
      

  2.   

    这个难道不是你曾经问过的
    http://topic.csdn.net/u/20100624/11/270ABAC2-1DAF-4CCC-988C-E14AC3CD8EED.html
      

  3.   

    create table tbscore
        (
        schoolname varchar(20) ,
        stuname varchar(20),
        coursename varchar(10),
        score int,
        testname varchar(60),
        termname varchar(10)
    )insert into tbscore
    select '金华四中','s1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','数学',30,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','语文',32,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','数学',40,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','语文',42,'2009年6月份婺城区初一年级各学校摸底考试','初一' 
    declare @i int
    set @i = 5  -- 输入参数
    select
    a.irange,
    isnull(b.社会,0) 社会,
    isnull(b.语文,0) 语文,
    isnull(b.数学,0) 数学,
    isnull(b.科学,0) 科学,
    isnull(b.英语,0) 英语
    from 
    (
       select number * @i ibegin,(number +1)*@i-1 iend, 
       cast(number * @i as varchar(5)) + '~' + cast((number +1)*@i-1 as varchar(5)) irange
       from master..spt_values a
       where a.type = 'p' and number < 200/@i) a
       left join 
    (
       select 
       score - score%@i ibegin,
       sum(case coursename when '社会' then 1 else 0 end) 社会,
       sum(case coursename when '语文' then 1 else 0 end) 语文,
       sum(case coursename when '数学' then 1 else 0 end) 数学,
       sum(case coursename when '科学' then 1 else 0 end) 科学,
       sum(case coursename when '英语' then 1 else 0 end) 英语
       from tbscore group by score - score%@i
    ) b
    on a.ibegin = b.ibegin-- 输入5的结果
    /*
    irange      社会          语文          数学          科学          英语
    ----------- ----------- ----------- ----------- ----------- -----------
    0~4         0           0           0           0           0
    5~9         0           0           0           0           0
    10~14       0           0           0           0           0
    15~19       0           0           0           0           0
    20~24       0           0           0           0           0
    25~29       0           0           0           0           0
    30~34       0           1           1           0           0
    35~39       0           0           0           0           0
    40~44       0           1           1           0           0
    45~49       0           0           0           0           0
    50~54       0           0           0           0           0
    55~59       0           0           0           0           0
    60~64       0           0           0           0           0
    65~69       0           0           0           0           0
    70~74       0           0           0           0           0
    75~79       0           0           0           0           0
    80~84       0           0           0           0           0
    85~89       0           0           0           0           0
    90~94       0           0           0           0           0
    95~99       0           8           8           0           0
    100~104     0           0           0           0           0
    105~109     0           0           0           0           0
    110~114     0           0           0           0           0
    115~119     0           0           0           0           0
    120~124     0           0           0           0           0
    125~129     0           0           0           0           0
    130~134     0           0           0           0           0
    135~139     0           0           0           0           0
    140~144     0           0           0           0           0
    145~149     0           0           0           0           0
    150~154     0           0           0           0           0
    155~159     0           0           0           0           0
    160~164     0           0           0           0           0
    165~169     0           0           0           0           0
    170~174     0           0           0           0           0
    175~179     0           0           0           0           0
    180~184     0           0           0           0           0
    185~189     0           0           0           0           0
    190~194     0           0           0           0           0
    195~199     0           0           0           0           0(40 行受影响)
    */--输入10 的结果
    /*
    irange      社会          语文          数学          科学          英语
    ----------- ----------- ----------- ----------- ----------- -----------
    0~9         0           0           0           0           0
    10~19       0           0           0           0           0
    20~29       0           0           0           0           0
    30~39       0           1           1           0           0
    40~49       0           1           1           0           0
    50~59       0           0           0           0           0
    60~69       0           0           0           0           0
    70~79       0           0           0           0           0
    80~89       0           0           0           0           0
    90~99       0           8           8           0           0
    100~109     0           0           0           0           0
    110~119     0           0           0           0           0
    120~129     0           0           0           0           0
    130~139     0           0           0           0           0
    140~149     0           0           0           0           0
    150~159     0           0           0           0           0
    160~169     0           0           0           0           0
    170~179     0           0           0           0           0
    180~189     0           0           0           0           0
    190~199     0           0           0           0           0(20 行受影响)
    */
      

  4.   

    declare @s int
    set @s=10
    select [分数段]=ltrim(number1)+'-'+ltrim(number2) ,
    [社会]=sum([社会]),
    [语文]=sum([语文]),
    [数学]=sum([数学]),
    [科学]=sum([科学]),
    [英语]=sum([英语])
    from 
    (
    select number,
    [社会]=sum(case when  coursename='社会' then 1 else 0 end),
    [语文]=sum(case when  coursename='语文' then 1 else 0 end),
    [数学]=sum(case when  coursename='数学' then 1 else 0 end),
    [科学]=sum(case when  coursename='科学' then 1 else 0 end),
    [英语]=sum(case when  coursename='英语' then 1 else 0 end)                   
    from master..spt_values s 
    left join tbscore b on score=number 
    where  type='p' and number between 0 and 200
    group by number
    ) a,
    (
    select number1=number,number2=number+@s-1 from master..spt_values s where type='p' and number between 0 and 200 and number%@s=0
    )b
    where number between number1 and number1
    group by ltrim(number1)+'-'+ltrim(number2)
    order by cast(left(ltrim(number1)+'-'+ltrim(number2),charindex('-',ltrim(number1)+'-'+ltrim(number2))-1) as int)
    分数段                       社会          语文          数学          科学          英语
    ------------------------- ----------- ----------- ----------- ----------- -----------
    0-9                       0           0           0           0           0
    10-19                     0           0           0           0           0
    20-29                     0           0           0           0           0
    30-39                     0           0           1           0           0
    40-49                     0           0           1           0           0
    50-59                     0           0           0           0           0
    60-69                     0           0           0           0           0
    70-79                     0           0           0           0           0
    80-89                     0           0           0           0           0
    90-99                     0           0           0           0           0
    100-109                   0           0           0           0           0
    110-119                   0           0           0           0           0
    120-129                   0           0           0           0           0
    130-139                   0           0           0           0           0
    140-149                   0           0           0           0           0
    150-159                   0           0           0           0           0
    160-169                   0           0           0           0           0
    170-179                   0           0           0           0           0
    180-189                   0           0           0           0           0
    190-199                   0           0           0           0           0
    200-209                   0           0           0           0           0(21 行受影响)
    太复杂了,楼主可以无视我
      

  5.   

    上面,写错了
    declare @s int
    set @s=10select [分数段]=ltrim(number1)+'-'+ltrim(number2) ,
    [社会]=sum([社会]),
    [语文]=sum([语文]),
    [数学]=sum([数学]),
    [科学]=sum([科学]),
    [英语]=sum([英语])
    from 
    (
    select number,
    [社会]=sum(case when  coursename='社会' then 1 else 0 end),
    [语文]=sum(case when  coursename='语文' then 1 else 0 end),
    [数学]=sum(case when  coursename='数学' then 1 else 0 end),
    [科学]=sum(case when  coursename='科学' then 1 else 0 end),
    [英语]=sum(case when  coursename='英语' then 1 else 0 end)                   
    from master..spt_values s 
    left join tbscore b on score=number 
    where  type='p' and number between 0 and 200
    group by number
    ) a
    ,
    (
    select number1=number,number2=number+@s-1 from master..spt_values s where type='p' and number between 0 and 200 and number%@s=0
    )b
    where number between number1 and number2
    group by ltrim(number1)+'-'+ltrim(number2)
    order by cast(left(ltrim(number1)+'-'+ltrim(number2),charindex('-',ltrim(number1)+'-'+ltrim(number2))-1) as int)分数段                       社会          语文          数学          科学          英语
    ------------------------- ----------- ----------- ----------- ----------- -----------
    0-9                       0           0           0           0           0
    10-19                     0           0           0           0           0
    20-29                     0           0           0           0           0
    30-39                     0           1           1           0           0
    40-49                     0           1           1           0           0
    50-59                     0           0           0           0           0
    60-69                     0           0           0           0           0
    70-79                     0           0           0           0           0
    80-89                     0           0           0           0           0
    90-99                     0           8           8           0           0
    100-109                   0           0           0           0           0
    110-119                   0           0           0           0           0
    120-129                   0           0           0           0           0
    130-139                   0           0           0           0           0
    140-149                   0           0           0           0           0
    150-159                   0           0           0           0           0
    160-169                   0           0           0           0           0
    170-179                   0           0           0           0           0
    180-189                   0           0           0           0           0
    190-199                   0           0           0           0           0
    200-209                   0           0           0           0           0(21 行受影响)
      

  6.   

    create table tbscore
        (
        schoolname varchar(20) ,
        stuname varchar(20),
        coursename varchar(10),
        score int,
        testname varchar(60),
        termname varchar(10)
    )insert into tbscore
    select '金华四中','s1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','数学',30,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','语文',32,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','数学',40,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','语文',42,'2009年6月份婺城区初一年级各学校摸底考试','初一'create table #tmp (id int identity,col varchar(10))
    declare @i int,@k int,@s varchar(8000)
    select  @i=10,@k=0,@s=isnull(@s+',','')+'['++coursename+']' from tbscore group by coursename
    while @k<200
    begin
    insert into #tmp select ltrim(@k+1)+'~'+ltrim(@k+@i) 
    set @k=@k+@i
    endset @s='
    select col,'+@s+' from (
    select a.coursename,b.col,1 num,id from (
    select coursename,ltrim(score/'+ltrim(@i)+'*'+ltrim(@i)+'+1)+''~''+ltrim(score/'+ltrim(@i)+'*'+ltrim(@i)+'+'+ltrim(@i)+') 分数段 from tbscore  
    ) a full outer join #tmp b on a.分数段=b.col
    ) a pivot(count(num) for coursename in('+@s+'))b order by id'
    print @s
    exec(@s)
    drop table #tmp
    /*
    col 数学 语文
    1~10 0 0
    11~20 0 0
    21~30 0 0
    31~40 1 1
    41~50 1 1
    51~60 0 0
    61~70 0 0
    71~80 0 0
    81~90 0 0
    91~100 8 8
    101~110 0 0
    111~120 0 0
    121~130 0 0
    131~140 0 0
    141~150 0 0
    151~160 0 0
    161~170 0 0
    171~180 0 0
    181~190 0 0
    191~200 0 0
    */ 
      

  7.   

    create table tbscore
        (
        schoolname varchar(20) ,
        stuname varchar(20),
        coursename varchar(10),
        score int,
        testname varchar(60),
        termname varchar(10)
    )insert into tbscore
    select '金华四中','s1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','数学',30,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华四中','s2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华四中','s5','语文',32,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','数学',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','数学',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','数学',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','数学',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','数学',40,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w1','语文',99,'2009年6月份婺城区初一年级各学校摸底考试','初一' union
    select '金华五中','w2','语文',98,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w3','语文',97,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w4','语文',96,'2009年6月份婺城区初一年级各学校摸底考试','初一'    union
    select '金华五中','w5','语文',42,'2009年6月份婺城区初一年级各学校摸底考试','初一'--科目名动态
    --带合计
    --分数间隔可变
    create table #tmp (id int identity,col varchar(10))
    declare @i int,@k int,@s varchar(8000)
    select  @i=5,@k=0,@s=isnull(@s+',','')+'SUM(CASE WHEN coursename='''+coursename+''' THEN 1 ELSE 0 END) '+coursename from tbscore group by coursename
    while @k<200
    begin
    insert into #tmp select ltrim(@k+1)+'~'+ltrim(@k+@i) 
    set @k=@k+@i
    end
    SET @S='
    SELECT 
    CASE WHEN GROUPING(col)=1 THEN ''合计'' ELSE col END ''分数段'','+@s+'
    from(
    select a.coursename,b.col,1 num,id from (
    select coursename,ltrim(score/'+ltrim(@i)+'*'+ltrim(@i)+'+1)+''~''+ltrim(score/'+ltrim(@i)+'*'+ltrim(@i)+'+'+ltrim(@i)+') 分数段 from tbscore  
    ) a full outer join #tmp b on a.分数段=b.col
    )a where col is not null group by col WITH ROLLUP order by max(id)
    '
    PRINT(@S)
    EXEC(@S)
    drop table #tmp
    ------------------------------结果-----------------------------
    /*
    间隔为10
    分数段 数学 语文
    1~10 0 0
    11~20 0 0
    21~30 0 0
    31~40 1 1
    41~50 1 1
    51~60 0 0
    61~70 0 0
    71~80 0 0
    81~90 0 0
    91~100 8 8
    101~110 0 0
    111~120 0 0
    121~130 0 0
    131~140 0 0
    141~150 0 0
    151~160 0 0
    161~170 0 0
    171~180 0 0
    181~190 0 0
    191~200 0 0
    合计 10 10间隔为5:
    分数段 数学 语文
    1~5 0 0
    6~10 0 0
    11~15 0 0
    16~20 0 0
    21~25 0 0
    26~30 0 0
    31~35 1 1
    36~40 0 0
    41~45 1 1
    46~50 0 0
    51~55 0 0
    56~60 0 0
    61~65 0 0
    66~70 0 0
    71~75 0 0
    76~80 0 0
    81~85 0 0
    86~90 0 0
    91~95 0 0
    96~100 8 8
    101~105 0 0
    106~110 0 0
    111~115 0 0
    116~120 0 0
    121~125 0 0
    126~130 0 0
    131~135 0 0
    136~140 0 0
    141~145 0 0
    146~150 0 0
    151~155 0 0
    156~160 0 0
    161~165 0 0
    166~170 0 0
    171~175 0 0
    176~180 0 0
    181~185 0 0
    186~190 0 0
    191~195 0 0
    196~200 0 0
    合计 10 10
    */