`
hjoo
  • 浏览: 74663 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

用存储过程实现交叉报表(动态列)

    博客分类:
  • J2SE
阅读更多
由于Birt不支持交叉报表(虽然能勉强实现,但十分麻烦),因此这几天郁闷死我了!最后决定在数据库里用存储过程先生成交叉表,然后直接用JSP显示出来。系统虽然是用的struts+spring+hibernate架构的,但为了简单起见就偷懒了!

记录下这些内容方便自己日后查看,出现一次意外就是把数据库还原回来,结果存储过程全没了白忙一场,还好印象比较深又搞定了!

由于我是好几张表关联,大概有6张吧,哈哈,所以先建个视图trainView把6张表全联接起来,代码:
SELECT tb.id, tb.sex, tb.age, tb.trainDays, tb.trainYear, p.PoliceNum, p.Name, p.deptname, 
      p.GradationNum, tm.trainMark, ti.name AS itemName, ti.code, ti.parentId
FROM dbo.TrainBase tb INNER JOIN
          (SELECT p.*, d .deptname
         FROM Misperson_Misdept pd LEFT JOIN
               misperson p ON pd.misperson_id = p.id LEFT JOIN
               misdept d ON pd.misdept_id = d .id) p ON 
      tb.personId = p.ID LEFT OUTER JOIN
      dbo.TrainMark tm ON tb.id = tm.trainId INNER JOIN
      dbo.TrainItem ti ON tm.itemId = ti.id


各张表的表结构在此就不给出了!

然后是存储过程trainReport的代码:
CREATE PROCEDURE trainReport
	@trainYear varchar(20)
 AS
	declare @sql varchar(8000)

set @sql = 'select name as 姓名,sex as 性别,age as 年龄,policeNum as 警号,deptName as 所在单位,trainDays as 参加集中训练时间,'

select @sql = @sql + 'sum(case itemName when '''+itemName+''' then trainMark else 0 end) as '''+itemName+''','
	from (select distinct itemName from trainView) as a
select @sql = left(@sql,len(@sql)-1) + ',trainYear,GradationNum from trainView where trainYear='+@trainYear+' group by name,sex,age,policeNum,deptName
,trainDays,trainYear,GradationNum order by GradationNum'
exec(@sql)
GO


代码都没有经过优化,以实现为第一考虑!
显示部分就直接在JSP里用JDBC调用存储过程,然后显示列和行
部分代码如下:
<%
			String trainYear = request.getParameter("trainYear");
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver")
					.newInstance();
			String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=YJGA";
			String user = "sa";
			String password = "sa";
			Connection conn = DriverManager.getConnection(url, user, password);
			CallableStatement proc = conn
					.prepareCall("execute trainReport '" + trainYear + "'");
			ResultSet rs = proc.executeQuery();
			ResultSetMetaData dm = rs.getMetaData();
		%>

动态显示列名:
<%
					for(int i = 1; i <= dm.getColumnCount()-2; i++){
						if(i==6){
							out.print("<td class=xl width=200>" + dm.getColumnName(i) + "</td>");
						}else{
							out.print("<td class=xl width=100>" + dm.getColumnName(i) + "</td>");
						}
					}
				%>


然后是显示记录:
<%
				while(rs.next()){
					out.print("<tr height=25 style='mso-height-source:userset;height:23.25pt'>");
					for(int i = 1; i <= dm.getColumnCount()-2; i++){
						out.print("<td class=xl>" + rs.getString(i) + "</td>");
					}
					out.print("</tr>");
				}
			%>		


最有用的部分就是存储过程trainReport,实现了将动态的行转为列的功能!
最终结果如下,参加集中训练时间后面那些列是根据每年的训练项目动态变化的!

姓名  性别 年龄 警号  所在单位 参加集中训练时间 测试项目 其它项目 现场急救
陈龙  男  25  990151 计通科  15       90    50    0
胡建欧 男  25  990150 计通科  15       0     90    80
分享到:
评论
1 楼 w156445045 2012-07-22  
博主您好,我现在碰到了和您一样的问题。我用iReport试着做了下,没做出来。
我动态显示页面,显示记录,这个不会呢,不知道是啥意思呢,谢谢!

相关推荐

    在Sql Server 数据库中利用存储过程实现动态交叉表

    通过上述知识点,可以构建出在SQL Server中使用存储过程实现动态交叉表的实现框架。实际操作中,根据业务需求的具体场景和数据特点,可能需要对上述技术进行灵活的组合和调整。最后,建议在实施任何存储过程或动态...

    JasperReport 中交叉报表指南

    JasperReport 中交叉报表的生成需要遵循一定的步骤,包括设置 subDataSets 数据源、填写数据源名称和 SQL 语句、创建交叉报表、设置行字段和列字段、设置详细信息、设置参数、设置数据源和连接、设置 Crosstab 参数...

    存储过程后台实现报表

    在数据库中实现交叉报表,通常需要通过动态SQL和聚合函数(如SUM、COUNT等)来组合数据,存储过程则提供了这样的功能,能够在后端高效地处理这些计算。 文件名“复件 FT_COM1”可能是指一个具体的报表实例,可能是...

    SQL Server交叉查询存储过程实现(带查询条件)

    SQL Server交叉查询存储过程实现(带查询条件) 一、交叉查询的概念 交叉查询是指将纵向的数据转换为横向的数据,以便更好地进行数据分析和展示。在SQL Server中,可以使用pivot函数或自定义函数来实现交叉查询。 ...

    用PB交叉报表写的用户管理、权限分配

    标题中的“用PB交叉报表写的用户管理、权限分配”揭示了一个使用PowerBuilder(PB)工具进行用户管理和权限分配的独特方法。PowerBuilder是一款流行的可视化开发工具,尤其在企业级应用开发中广泛使用,其强大的数据...

    基于Delphi SQL Server交叉报表的实现.pdf

    为了解决这一问题,本文提出了一种方法,即利用Delphi本身提供的控件结合SQL Server的存储过程来实现交叉报表的生成。在不依赖第三方报表工具的情况下,开发人员可以通过编写自定义的SQL查询语句,配合存储过程来...

    根据你的选择产生不同的交叉报表1.0

    在这个“根据你的选择产生不同的交叉报表1.0”项目中,我们可以推测这是一个Access数据库应用程序,利用了Access内置的交叉表查询功能,以及可能的VBA编程来实现用户交互和自定义报表生成。 Access是Microsoft ...

    交叉表示例(含水晶报表和RDLC报表)

    交叉报表是一种特殊的报表格式,主要用于展示数据的行列交叉分析,它可以清晰地呈现多维度的数据集。在IT领域,尤其是在数据分析和报表设计时,交叉报表是非常重要的工具。此压缩包文件包含有关“交叉表示例”的示例...

    行业分类-设备装置-一种交叉报表生成方法.zip

    交叉报表是一种数据可视化工具,常用于商业智能领域,它能够以矩阵形式展示数据,以便用户可以从多个维度分析信息。...通过深入理解和运用交叉报表生成方法,企业可以在数据驱动的决策过程中取得显著优势。

    利用水晶报表动态绑定数据源实现动态交叉表的方法研究

    总结来说,利用水晶报表动态绑定数据源实现动态交叉表的方法,主要步骤包括:1) 在数据库端创建动态生成交叉表的逻辑,如函数和存储过程;2) 利用Push模式动态绑定这些数据源,将数据推送至水晶报表引擎;3) 水晶...

    pb动态报表

    在动态报表中,DataWindow可以设计为表格、图表、交叉表等多种形式,而且可以通过编程动态调整其列、行或者数据源。 2. **SQL表达式和参数**:在PB中,可以使用SQL语句动态地从数据库中提取数据。SQL表达式可以包含...

    C#动态交叉表查询

    在编程领域,尤其是在使用C#进行数据处理时,动态交叉表查询是一种常用的技术,它能够帮助我们以矩阵或网格的形式展示数据,使我们能够轻松地分析多维数据集。动态交叉表查询允许开发者根据需求自定义列和行,提供...

    怎样动态指定水晶报表的数据源

    这极大地扩展了水晶报表的功能,使得能够处理一些原本难以用静态数据源实现的复杂报表,如交叉报表。 XML文件可以通过DataSet的`GetXml()`方法生成。例如,如果你有一个填充好的DataSet,你可以调用`ds.GetXml()`来...

    如何动态指定水晶报表数据库

    通过水晶报表,用户可以设计各种格式的报表,如表格、图表、交叉表等,并提供强大的数据过滤、排序和分组功能。 二、动态指定数据库的重要性 在实际应用中,数据库可能因项目需求、系统升级或数据迁移等原因而发生...

    SQL动态交叉表,希望对SQL程序员有帮助

    4. **子查询和集合函数**:在动态交叉表的构建过程中,通常会用到子查询来获取所有可能的列值,然后将这些值传递给外层查询。集合函数(如UNION ALL)用于组合这些值,形成最终的列名。 5. **动态SQL**:由于列的...

    mysql 行列动态转换的实现(列联表,交叉表)

    此外,如果数据量非常大,这些动态构建的SQL可能会影响性能,这时可以考虑使用数据库支持的其他功能,如存储过程或自定义函数,或者在应用程序层进行处理,以提高效率。 总之,MySQL的行列转换技巧是数据处理中的...

    cognos报表开发技术

    该技术支持多种报表类型,包括列表报表、交叉表报表、图表报表等,可以满足企业的各种报表需求。 6. 报表开发技术优点 Cognos报表开发技术具有多种优点,包括快速开发、灵活的报表设计、强大的数据分析功能等。该...

    birt动态分组报表制作.docx

    通过以上步骤,你已经掌握了如何使用BIRT创建动态分组交叉报表的基本流程。在实际操作中,可能需要根据具体需求进行调整和优化,但这个基础框架为你提供了一个良好的起点。记住,BIRT的强大在于其灵活性和定制能力,...

    oracle交叉表sql

    根据提供的部分代码内容,我们可以看到这是一个用存储过程来实现交叉表的例子。这里主要涉及以下几个关键点: 1. **存储过程定义**: - `DELIMITER $$`:设置结束符为`$$`,用于定义存储过程。 - `DROP PROCEDURE...

Global site tag (gtag.js) - Google Analytics