关于交叉报表的动态实现

动态

很多时候我们需要得到交叉列表,最近做课程设计就需要这样的功能,比如要得到一个班某学期的成绩,因为每一学期所学科目和数量都是变化的,这就要求动态的查询以得到成绩。而且得到这样的显示形式:
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

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

时间: 2024-08-03 20:27:22

关于交叉报表的动态实现的相关文章

创建交叉报表(oracle)

oracle|创建 创建交叉报表 create table t1(goodid  number(10)  not null,saledate  date   not null,salesum  number(10)); 要求生成本年度每个月的产品销售状况表  m1 m2 m3 ... m12g1g2...gn 下面是生成报表的sql SELECT goodid, SUM(decode(to_char(saledate,'mm'),'01',salesum)) "01", SUM(dec

Delphi中用服务器组件解决WEB交叉报表问题(1)

web开发最麻烦的是做报表,特别是交叉报表.要将查询得到的看起来平淡无奇的数据展开成复杂的报表不知要费煞多少周张.下次维护时看到冗长的SQL语句或长达数页的程序代码,都有种快要晕厥的感觉. 最近,这种好事又让我碰上.公司因为费用统计的需要,要开发一份各分公司之间调货量的统计表,如下图所示.表中坚向为分公司帐套名称(调出方),横向为帐套中的客户名称(调入方),这是一份典型的交叉报表. 制作这份报表有两个难点: 一.每一个分公司帐套对应数据库服务器上一个数据库,并分别存放在两台以上的数据库服务器中,

如何在水晶报表中动态添加字段

原文:如何在水晶报表中动态添加字段 问题:水晶报表中,因为数据源的字段是不固定的,可否在运行时动态添加字段,就象在winform中动态添加控件一样?(更新:2003-11-05)--------------------------------------解决方案:用"公式字段"1.根据字段的最大数量,定义若干个"公式字段",FormulaFeild1.FormulaFeild2--,公式为空:2.把"公式字段"按顺序放在"详细资料&qu

ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案

原文:ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案 在 ActiveReports 中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组.排序.过滤.小计.合计等操作,可以满足您报表的智能数据分析等需求.在矩阵控件中组的行数和列数由每个行分组和列分组中的唯一值的个数确定.同时,您可以按行组和列组中的多个字段或表达式对数据进行分组.在运行时,当组合报表数据和数据区域时,随着为列组添加列和为行组添加行,矩阵将在页面上水平和垂直增长. 在矩阵控件中,

ActiveReports 报表应用教程 (9)---交互式报表之动态排序

原文:ActiveReports 报表应用教程 (9)---交互式报表之动态排序 在 ActiveReports 中除了提供对数据源进行排序的功能之外,还提供了最终用户排序功能,最终用户可以对报表进行区域内排序和整个数据源排序,结合数据钻取.过滤等功能可以让用户更方便地分析报表数据. 1.创建报表文件 在应用程序中创建一个名为 rptProductListForSort.rdlx 的 ActiveReports 报表文件,使用的项目模板为 ActiveReports 页面报表,创建完成之后从 V

水晶报表 FieldObject 动态改变某行字体

问题描述 现有数据列1列2列3A1B1C1A2B2C2使用水晶报表中的FieldObejct填充上述内容后,想根据列1的值,动态设置列3的字体(如从宋体变成黑体)请问,如何实现呢? 解决方案 本帖最后由 starlessnt 于 2014-07-31 11:22:01 编辑解决方案二:TextObjecttx;tx=(TextObject)rptDoc.ReportDefinition.ReportObjects["Text23"];tx.ApplyFont(Font);解决方案三:是

vs2005中 水晶报表如何动态添加字段呢?求救

问题描述 如题,水晶报表中的详细资料部分要在程序中用代码动态添加,也就是说显示的字段是未知的,在程序中控制,我应该怎么做呢?哪位兄弟给个例子??在线等... 解决方案 解决方案二:先定義一些字段,在代碼中對這些字段賦值,用推的方式看看解决方案三:阿泰的软件实用主义http://www.cnblogs.com/babyt/archive/2008/01/03/1024941.html解决方案四:在水晶报表里只能用公式.或函数来完成一些计算.统计.如果要加字段,建议在生成报表之前用数据库完成.解决方

Delphi中用服务器组件解决WEB交叉报表问题(2)

Fast Report是一个经典的报表控件,不过其导出功能只支持导出到磁盘文件,而此项目为了避开权限的限制和出于服务器安全的需要,要求将Fast Report生成的报表导出到内存流,所以要修改Fast Report源码. Fast Report2.5的导出函数在FR_Class文件中声明,参考此函数,可以很轻易的写出导出到内存流的函数: //添加导出到内存流的支持 --Conch 2007-09-10-- procedure TfrReport.ExportToStream(Filter: Tf

VS2010 自带Report报表打印动态添加code39条形码问题

问题描述 寻找解决方案?我正在做一个通过报表制作模板打印票据的功能,需要打印条码.有两种可参考方案,由于能力有限我没能研究出来:方法一:由于报表在定义显示字段时需要指定数据集,定义数据表二进制字段CodeBytes,在程序初始化时新建一个DataTable定义Row["CodeBytes"]保存条形码.为Report添加LocalReport指定DataSources和ReportPath.结果显示"错误号"部分代码如下:publicvoidInitialBarCo