这种格式的优秀率,及格率 sql 怎么写,高分求!

renzhiqiang5 2009-12-08 09:57:24
班级 语文优秀率 数学优秀率 英语优秀率....
1 80% 90% 65%
2 80% 90% 65%
3 80% 90% 65%

班级 语文及格率 数学及格率 英语及格率....
1 80% 90% 65%
2 80% 90% 65%
3 80% 90% 65%

表结构是
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94

科目是[b]不[/b]确定的,如下列这样的例子
strSql:='DECLARE @sql varchar(8000) ' +
'SET @sql = ''SELECT distinct 学号,姓名,班级 '' ' +
'SELECT @sql = @sql + '' , max(case 科目 when ''''''+科目+'''''' then 成绩 else 0 end)AS ''''''+科目+'''''' '' ' +
'FROM (SELECT distinct 科目 FROM sp) AS a ' +
'SET @sql = @sql + '' , CAST(AVG(成绩*1.0) AS decimal(18,2)) 平均分 , SUM(成绩) 总分'''+
'select @sql = @sql +'' ,(select count(1)+1 from (select 姓名,sum(成绩) as 总分 from sp group by 姓名) r where 总分 >SUM(t.成绩) and 姓名 <> t.姓名) as 排名'''+
'select @sql = @sql +'' ,convert(varchar(10),cast(sum(case when 成绩 >= 90 then 1 else 0 end)*1.0/count(1)*100 as dec(5,2))) as 优秀率 '''+
'select @sql = @sql + '',convert(varchar(10),cast(sum(case when 成绩 >= 60 then 1 else 0 end)*1.0/count(1)*100 as dec(5,2))) as 及格率 FROM sp t GROUP BY 姓名,学号,班级 order by 排名 asc'''+
'EXEC (@sql)';
...全文
662 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2009-12-08
  • 打赏
  • 举报
回复
优秀率是按照分数>=90来算的.
及格率是按照分数>=60来算的.

如果不对,自己更改对应分数即可.
dawugui 2009-12-08
  • 打赏
  • 举报
回复
create table tb(班级 int,姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values(1,'张三' , '语文' , 73)
insert into tb values(1,'张三' , '数学' , 83)
insert into tb values(1,'张三' , '物理' , 93)
insert into tb values(1,'李四' , '语文' , 74)
insert into tb values(1,'李四' , '数学' , 84)
insert into tb values(1,'李四' , '物理' , 94)
go

declare @sql varchar(8000)
set @sql = 'select 班级 '
select @sql = @sql + ' , cast(cast(sum(case when 课程 = ''' + 课程 + ''' and 分数 >= 90 then 1 else 0 end)*100.0/sum(case when 课程 = '''+ 课程 + ''' then 1 else 0 end) as decimal(18,2)) as varchar) [' + 课程 + '优秀率(%)]'
+ ' , cast(cast(sum(case when 课程 = ''' + 课程 + ''' and 分数 >= 60 then 1 else 0 end)*100.0/sum(case when 课程 = '''+ 课程 + ''' then 1 else 0 end) as decimal(18,2)) as varchar) [' + 课程 + '及格率(%)]'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 班级'
exec(@sql)

drop table tb

/*
班级 数学优秀率(%) 数学及格率(%) 物理优秀率(%) 物理及格率(%) 语文优秀率(%) 语文及格率(%)
----------- ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------
1 0.00 100.00 100.00 100.00 0.00 100.00

*/
duanzhi1984 2009-12-08
  • 打赏
  • 举报
回复
动态语句。。

自己研究下
我的经验是,先写成非动态的语句。若查询出来,再用动态语句进行查询。。
这样有助于提高自己
--小F-- 2009-12-08
  • 打赏
  • 举报
回复
你自己不是写出来了吗??
--小F-- 2009-12-08
  • 打赏
  • 举报
回复
动态行转列
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

------------------

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧