• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

关于交叉报表的动态实现

发布: 2007-6-30 18:56 | 作者: admin | 来源: | 查看: 14次 | 进入软件测试论坛讨论

领测软件测试网 很多时候我们需要得到交叉列表,最近做课程设计就需要这样的功能,比如要得到一个班某学期的成绩,因为每一学期所学科目和数量都是变化的,这就要求动态的查询以得到成绩。而且得到这样的显示形式:
studentID studentName courseName1 courseName2 courseName3 ……
1 lupenda 66 77 88 ……
。
。
。
下面的例子就是为了实现上面的功能,该存取过程涉及3张表:

Course表:
CourseID,CourseName,Duration,[Year],MajorID,Semester

StudentData表:
StudentID,StudentName,ClassID……

Student_Course表:
StudentID,CourseID,Score


--根据不同参数取得成绩
--可以得到某学期,某专业,某班级,某学生的成绩

CREATE procedure GetScore
@Year int ,@Semester bit ,@MajorID int = null,@ClassID int = null,@StudentID int = null
as

declare @var varchar(200)
declare @sql varchar(8000)

set @sql=‘’‘’

--放进临时表
select distinct CourseName into #tb from Course where Course.Year = @Year and Course.Semester = @Semester

--声明游标
declare cur cursor
for select CourseName from #tb
open cur
fetch next from cur into @var
while @@fetch_status=0
begin
set @sql = @sql + ‘’sum(case when Course.CourseName = ‘’‘’‘’ +@var+ ‘’‘’‘’ then Student_Course.Score else 0 end) as ‘’+ @var+‘’,‘’
fetch next from cur into @var
end

set @sql = left(@sql,len(@sql)-1)


set @sql = ‘’select Class.ClassName as 班级,Student_Course.StudentID as 全学号,StudentData.StudentName as 姓名, ‘’ +@sql+ ‘’
from StudentData,Student_Course,Course ,Class
where Student_Course.CourseID = Course.CourseID
and StudentData.StudentID = Student_Course.StudentID
and StudentData.ClassID = Class.ClassID‘’


--根据输入参数的不同创建查询语句
if @Year is not null
set @sql = @sql+ ‘’ and Course.Year = ‘’+ Cast( @Year as varchar(4)) --强制转换为字符串

if @Semester is not null
set @sql = @sql+ ‘’ and Course.Semester = ‘’+ Cast( @Semester as varchar(1))

if @MajorID is not null
set @sql = @sql+ ‘’ and Course.MajorID = ‘’+ Cast( @MajorID as varchar(4))

if @ClassID is not null
set @sql = @sql+ ‘’ and StudentData.ClassID = ‘’+ Cast( @ClassID as varchar(4))

if @StudentID is not null
set @sql = @sql+ ‘’ and StudentData.StudentID = ‘’+ Cast( @StudentID as varchar(8))

set @sql = @sql+ ‘’group by Class.ClassName,Student_Course.StudentID,StudentData.StudentName order by Student_Course.StudentID ‘’


exec(@sql)

deallocate cur
drop table #tb
GO

至此,该存取过程实现了我们想要的功能.第一次发文章,请大家多多支持!

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网