create table 成绩表(学号 varchar(10),成绩 int,学校代号 varchar(10))
insert 成绩表 select '001',730,'01'
union all select '002',630,'01'
union all select '003',722,'02'
union all select '004',725,'02'
union all select '005',730,'03'
create table 学校表(学校代号 varchar(10),学校 varchar(10))
insert 学校表 select '01','一中'
union all select '02','二中'
create table 成绩分布表(分数范围 varchar(10),最小值 int,最大值 int)
insert 成绩分布表 select '700~750',700,750
union all select '650~700',650,700
go
declare @s varchar(8000)
set @s=''
select @s=@s+',['+学校+']=sum(case b.学校代号 when '''+学校代号+''' then 1 else 0 end)'
from 学校表
order by 学校代号
exec('select a.分数范围'+@s+'
from 成绩分布表 a
left join 成绩表 b on b.成绩 between a.最小值 and a.最大值
group by a.分数范围
order by a.分数范围 desc')
go
select c.分数范围 ,b.学校代号
into #a from 成绩表 b join 成绩分布表 c
on b.name between c.最小值 and c.最大值
select c.分数范围 ,b.学校代号 into #a
from 成绩表 b join 成绩分布表 c
on b.name between c.最小值 and c.最大值
declare @sql nvarchar(8000)
set @sql='select 分数范围,'
select @sql=@sql +' sum(case 学校代号 when ''' +学校代号 +''' then 1 else 0 end) as ''' +学校 +''',' from 学校表
select @sql=left(@sql,len(@sql)-1) +' from #a group by 分数范围'
exec( @sql)
drop table #a
CREATE PROCEDURE dbo.StatScores AS
declare @strsum as varchar(2000)
set @strsum=''
select @strsum=@strsum+',sum(case when 学校代号='''+rtrim(学校代号)+''' then 个数 else 0 end) as '+rtrim(学校)
from (select distinct 学校,学校代号 from 学校表 ) z
declare @sql as varchar(8000)
set @sql='select z.分数范围 '+@strsum+
' from
(
select 分数范围,学校代号,count(*) as 个数 from
(select 分数范围,b.成绩,b.学校代号 from 成绩分布表 a ,成绩表 b
where b.成绩 > a.最小值 and b.成绩<a.最大值) t
group by 分数范围,学校代号
) z
group by z.分数范围
order by 分数范围 desc'
declare @strsum as varchar(2000)
set @strsum=''
select @strsum=@strsum+',sum(case when 学校='''+rtrim(学校)+''' then 个数 else 0 end) as '+rtrim(学校)
from (select distinct 学校 from 学校表 ) z
declare @sql as varchar(8000)
set @sql='select z.分数范围 '+@strsum+
' from
(
select 分数范围,学校,count(*) as 个数 from
(select 分数范围,c.学校,b.成绩 from 成绩分布表 a ,成绩表 b ,学校表 c
where b.成绩 > a.最小值 and b.成绩<a.最大值 and b.学校代号=c.学校代号) t
group by 分数范围,学校
) z
group by z.分数范围
order by 分数范围 desc'
select z.分数范围,
sum(case when 学校='一中' then 个数 else 0 end) as 一中,
sum(case when 学校='二中' then 个数 else 0 end) as 二中
from
(
select 分数范围,学校,count(*) as 个数 from
(select 分数范围,c.学校,b.成绩 from 成绩分布表 a ,成绩表 b ,学校表 c
where b.成绩 > a.最小值 and b.成绩<a.最大值 and b.学校代号=c.学校代号) t
group by 分数范围,学校
) z
group by z.分数范围
order by 分数范围 desc