关于交叉报表的动态实现 [http://blog.csdn.net/lupenda/archive/2004/10/18/141744.aspx]
2007-08-29 09:00
691 查看
很多时候我们需要得到交叉列表,最近做课程设计就需要这样的功能,比如要得到一个班某学期的成绩,因为每一学期所学科目和数量都是变化的,这就要求动态的查询以得到成绩。而且得到这样的显示形式:
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
至此,该存取过程实现了我们想要的功能.第一次发文章,请大家多多支持!
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
至此,该存取过程实现了我们想要的功能.第一次发文章,请大家多多支持!
相关文章推荐
- [转]水晶报表列太多导致设计界面容纳不下的解决方法 [http://blog.csdn.net/lupenda/archive/2005/08/12/452878.aspx]
- [转] 再谈水晶报表 (王智谈水晶报表系列2 附源码) [http://blog.csdn.net/sywangzhi/archive/2007/07/08/1682948.aspx]
- [转] 部署水晶报表时的常见问题及解决方案 [http://blog.csdn.net/ytbada/archive/2007/06/26/1666594.aspx]
- C#向Excel报表中插入图片的2种方法 http://blog.csdn.net/net_lover/archive/2007/07/23/1702797.aspx
- 在C#中使用异步Socket编程实现TCP网络服务的C/S的通讯构架(一)----基础类库部分(来源:http://blog.csdn.net/yangjundeng/archive/2005/03/17/321920.aspx)
- C++ 事件机制实现(转载自http://blog.csdn.net/khler/archive/2007/08/07/1729638.aspx)
- 按回车实现点击某按钮的效果 http://blog.csdn.net/jjzaihaozhe/archive/2007/08/18/1749635.aspx
- FTP搜索引擎的设计与实现http://blog.csdn.net/heiyeshuwu/archive/2007/03/25/1540532.aspx
- [转] 在ASP.NET下用Microsoft Excel进行数据分析与报表(ASP.Net)[http://blog.csdn.net/hoker_long/archive/2004/09/21/112470.aspx]
- asp.net中验证码的实现 (转自http://blog.csdn.net/zhoufoxcn/archive/2007/07/19/1698615.aspx)
- [转] 在水晶报表中实现任意选择指定字段显示 (vb.net vs2003) [来自--http://blog.csdn.net/rainbowsoftware/]
- 关于ubuntu10.04触摸板不能禁用和gedit文本编辑器中文乱码问题的一个解方案 转自:http://blog.csdn.net/luodayuan/archive/2010/05/23/5617615.aspx
- 关于UML的个人见解--转自http://blog.csdn.net/ccat/archive/2010/06/13/5668593.aspx
- [转] 水晶报表Q&A [http://blog.csdn.net/wzhibin/archive/2007/06/01/1634209.aspx]
- [转] 彻底解决水晶报表中登陆的错误 [http://blog.csdn.net/wzhibin/archive/2007/06/01/1634370.aspx]
- 关于Windows核心编程的编译环境http://blog.csdn.net/lihaishan/archive/2007/09/17/1788891.aspx
- GDI中的坐标映射问题 (转载自http://blog.csdn.net/huawdai/archive/2002/01/15/6169.aspx)
- java的内存泄露(转自:http://blog.csdn.net/elimago/archive/2007/12/18/1946380.aspx)
- http://blog.csdn.net/lizanhong/archive/2004/07/15/42459.aspx
- Android动画学习Demo(3) 关于Property Animation的TimeInpolator和TypeEvaluatorhttp://blog.csdn.net/linmiansheng