由于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
分享到:
- 2006-12-30 16:54
- 浏览 3526
- 评论(1)
- 论坛回复 / 浏览 (0 / 4668)
- 查看更多
相关推荐
通过上述知识点,可以构建出在SQL Server中使用存储过程实现动态交叉表的实现框架。实际操作中,根据业务需求的具体场景和数据特点,可能需要对上述技术进行灵活的组合和调整。最后,建议在实施任何存储过程或动态...
JasperReport 中交叉报表的生成需要遵循一定的步骤,包括设置 subDataSets 数据源、填写数据源名称和 SQL 语句、创建交叉报表、设置行字段和列字段、设置详细信息、设置参数、设置数据源和连接、设置 Crosstab 参数...
在数据库中实现交叉报表,通常需要通过动态SQL和聚合函数(如SUM、COUNT等)来组合数据,存储过程则提供了这样的功能,能够在后端高效地处理这些计算。 文件名“复件 FT_COM1”可能是指一个具体的报表实例,可能是...
SQL Server交叉查询存储过程实现(带查询条件) 一、交叉查询的概念 交叉查询是指将纵向的数据转换为横向的数据,以便更好地进行数据分析和展示。在SQL Server中,可以使用pivot函数或自定义函数来实现交叉查询。 ...
标题中的“用PB交叉报表写的用户管理、权限分配”揭示了一个使用PowerBuilder(PB)工具进行用户管理和权限分配的独特方法。PowerBuilder是一款流行的可视化开发工具,尤其在企业级应用开发中广泛使用,其强大的数据...
为了解决这一问题,本文提出了一种方法,即利用Delphi本身提供的控件结合SQL Server的存储过程来实现交叉报表的生成。在不依赖第三方报表工具的情况下,开发人员可以通过编写自定义的SQL查询语句,配合存储过程来...
在这个“根据你的选择产生不同的交叉报表1.0”项目中,我们可以推测这是一个Access数据库应用程序,利用了Access内置的交叉表查询功能,以及可能的VBA编程来实现用户交互和自定义报表生成。 Access是Microsoft ...
交叉报表是一种特殊的报表格式,主要用于展示数据的行列交叉分析,它可以清晰地呈现多维度的数据集。在IT领域,尤其是在数据分析和报表设计时,交叉报表是非常重要的工具。此压缩包文件包含有关“交叉表示例”的示例...
交叉报表是一种数据可视化工具,常用于商业智能领域,它能够以矩阵形式展示数据,以便用户可以从多个维度分析信息。...通过深入理解和运用交叉报表生成方法,企业可以在数据驱动的决策过程中取得显著优势。
总结来说,利用水晶报表动态绑定数据源实现动态交叉表的方法,主要步骤包括:1) 在数据库端创建动态生成交叉表的逻辑,如函数和存储过程;2) 利用Push模式动态绑定这些数据源,将数据推送至水晶报表引擎;3) 水晶...
在动态报表中,DataWindow可以设计为表格、图表、交叉表等多种形式,而且可以通过编程动态调整其列、行或者数据源。 2. **SQL表达式和参数**:在PB中,可以使用SQL语句动态地从数据库中提取数据。SQL表达式可以包含...
在编程领域,尤其是在使用C#进行数据处理时,动态交叉表查询是一种常用的技术,它能够帮助我们以矩阵或网格的形式展示数据,使我们能够轻松地分析多维数据集。动态交叉表查询允许开发者根据需求自定义列和行,提供...
这极大地扩展了水晶报表的功能,使得能够处理一些原本难以用静态数据源实现的复杂报表,如交叉报表。 XML文件可以通过DataSet的`GetXml()`方法生成。例如,如果你有一个填充好的DataSet,你可以调用`ds.GetXml()`来...
通过水晶报表,用户可以设计各种格式的报表,如表格、图表、交叉表等,并提供强大的数据过滤、排序和分组功能。 二、动态指定数据库的重要性 在实际应用中,数据库可能因项目需求、系统升级或数据迁移等原因而发生...
4. **子查询和集合函数**:在动态交叉表的构建过程中,通常会用到子查询来获取所有可能的列值,然后将这些值传递给外层查询。集合函数(如UNION ALL)用于组合这些值,形成最终的列名。 5. **动态SQL**:由于列的...
此外,如果数据量非常大,这些动态构建的SQL可能会影响性能,这时可以考虑使用数据库支持的其他功能,如存储过程或自定义函数,或者在应用程序层进行处理,以提高效率。 总之,MySQL的行列转换技巧是数据处理中的...
该技术支持多种报表类型,包括列表报表、交叉表报表、图表报表等,可以满足企业的各种报表需求。 6. 报表开发技术优点 Cognos报表开发技术具有多种优点,包括快速开发、灵活的报表设计、强大的数据分析功能等。该...
通过以上步骤,你已经掌握了如何使用BIRT创建动态分组交叉报表的基本流程。在实际操作中,可能需要根据具体需求进行调整和优化,但这个基础框架为你提供了一个良好的起点。记住,BIRT的强大在于其灵活性和定制能力,...
根据提供的部分代码内容,我们可以看到这是一个用存储过程来实现交叉表的例子。这里主要涉及以下几个关键点: 1. **存储过程定义**: - `DELIMITER $$`:设置结束符为`$$`,用于定义存储过程。 - `DROP PROCEDURE...