日期:2014-05-18  浏览次数:20365 次

求一个SQL存储过程语句!!!!
学生信息表A:
学生ID 姓名 所在班级ID
101 张三 11  
102 李四 12  
103 王五 11  
------------------
班级信息表B:
班级ID 名称
11 文科班
12 理科班
-------------------
评价等级表C:
学生ID 评价等级 评价时间
101 好 2011-10-10 
102 中 2011-10-11
101 好 2011-10-10
103 好 2011-10-10
101 中 2011-10-10
101 差 2011-10-10 
-------------------------------------------------
要求统计出学生2011年度的评价情况 ,效果如下:
学生姓名 班级名称 好评次数 中评次数 差评次数
--- ---- 次数(占比) 次数(占比) 次数(占比)  

------------------
求实现此功能的存储过程语句

------解决方案--------------------
ltrim(cast(sum(case when 评价等级='?' then 1 else 0 end)*1./count(*) as decimal(8,2)))+'%'

?表示等级的具体内容 好 中 差 等。
------解决方案--------------------
SQL code

select 学生ID,
  ltrim(cast(sum(case when 评价等级='好' then 1 else 0 end)*1./count(*) as decimal(8,2)))+'%' as [好评次数],
  ltrim(cast(sum(case when 评价等级='中' then 1 else 0 end)*1./count(*) as decimal(8,2)))+'%' as [中评次数],
  ltrim(cast(sum(case when 评价等级='差' then 1 else 0 end)*1./count(*) as decimal(8,2)))+'%' as [差评次数]
from tb
group by 学生ID

------解决方案--------------------
/*
学生信息表A:
学生ID 姓名 所在班级ID
101 张三 11
102 李四 12
103 王五 11
------------------
班级信息表B:
班级ID 名称
11 文科班
12 理科班
-------------------
评价等级表C:
学生ID 评价等级 评价时间
101 好 2011-10-10 
102 中 2011-10-11
101 好 2011-10-10
103 好 2011-10-10
101 中 2011-10-10
101 差 2011-10-10 
-------------------------------------------------
要求统计出学生2011年度的评价情况 ,效果如下:
学生姓名 班级名称 好评次数 中评次数 差评次数
--- ---- 次数(占比) 次数(占比) 次数(占比)

------------------
求实现此功能的存储过程语句
*/
go
if object_id('studentinfo') is not null
drop table studentinfo
go
create table studentinfo(
学生ID varchar(3),
姓名 varchar(10),
班级ID varchar(2)
)
go
insert studentinfo
select '101','张三','11' union all
select '102','李四','12' union all
select '102','王五','11'
go
go
if object_id('classinfo') is not null
drop table classinfo
go
create table classinfo(
班级ID varchar(2),
名称 varchar(10),
)
go
insert classinfo
select '11','文科班' union all
select '12','理科班'

go
if object_id('stulevel') is not null
drop table stulevel
go
create table stulevel(
学生ID varchar(3),
[level] varchar(2),
destime datetime
)
go
insert stulevel
select '101','好','2011-10-10' union all
select '102','中','2011-10-11' union all
select '101','好','2011-10-10' union all
select '103','好','2011-10-10' union all
select '101','中','2011-10-10' union all
select '101','差','2011-10-10'


select 姓名,名称,
sum(isnull(case when [level]='好' then 1 end,0)) as 好评次数,
sum(isnull(case when [level]='中' then 1 end,0)) as 中评次数,
sum(isnull(case when [level]='差' then 1 end,0)) as 差评次数,
cast(sum(isnull(case when [level]='好' then 1 end,0)) as decimal(8,2))/COUNT(*) as 好评比例,
cast(sum(isnull(case when [level]='中' then 1 end,0))as decimal(8,2))/COUNT(*) as 中评比例, 
cast(sum(isnull(case when [level]='差' then 1 end,0))as decimal(8,2))/COUNT(*) as 差评比例
from studentinfo s 
inner join classinfo c on s.班级ID=c.班级ID
inner join stulevel on s.学生ID=stulevel.学生ID
group by 姓名,名称

/*
姓名 名称 好评次数 中评次数 差评次数 好评比例 中评比例 差评比例
李四 理科班 0 1 0 0.0000000000000 1.0000000000000 0.0000000000000
王五 文科班 0 1 0 0.0000000000000 1.0000000000000 0.0000000000000
张三 文科班 2 1 1 0.5000000000000