iReport如何实现这种交叉报表?

qinli 2011-02-24 01:13:41
表1内容(注意,科目是动态的,即不知道有多少,所以不要再建议用case...when...then...end这种固定行转列方式了)
姓名,科目,分数
张三,语文,80
张三,数学,80
李四,数学,80
王五,体育,80
............

通过用Ireport在summary里拉一个交叉报表如下图还是很容易的!
语文 数学 体育 ....
张三 80 80 0
李四 0 80 0
王五 0 0 80
... ... ... ...

~~~~~~~~~~~~~~~~~~~~注意:问题来啦~~~~~~~~~~~~~~~~~~

问题在于还有个表2:
姓名 班级 学号
张三 一班 01
李四 二班 02
王五 三班 03

最终想生成
班级 学号 语文 数学 体育 ....
张三 一班 01 80 80 0
李四 二班 02 0 80 0
王五 三班 03 0 0 80
... ... ... ... ... ...

这个SQL语句要怎么写?或者说在iReport里怎么实现?


...全文
303 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qinli 2011-03-01
  • 打赏
  • 举报
回复
已经实现,结帖吧,散分了.

个人总结:
如果科目是固定的,就用case when then语句来强制行转列,具体网上搜索一大吧,但缺点是速度慢,即使处理科目超过10个,且最终记录超过上千个这种轻量级数据处理,速度也难以忍受.

而遇到科目是动态的话,用case语句不可能便历出所有科目来.目前看只有用交叉报表来实现(当然也可以用存储过程做预处理,那另当别论)是最完美的,速度快,由于iReport只支持单列,所以只能实现
语文 数学 体育 ....
张三 80 80 0
李四 0 80 0
王五 0 0 80
如果还需要加上固定列,比如最终要形成

班级 学号 性别 语文 数学 体育 ....
张三 1班 1 男 80 80 0
李四 1班 2 男 0 80 0
王五 1班 3 女 0 0 80

最简单的办法就是Union,把动态列表Union上固定列.
fskjb01 2011-02-24
  • 打赏
  • 举报
回复
关键科目是动态的
yukiMark 2011-02-24
  • 打赏
  • 举报
回复
在你实现第一问题的基础上,查询后返回数据就可以吧
with a as (select 'name' || rownum  name,20*rownum score from dual connect by rownum < 7),
b as(select 'name' || rownum name, mod(rownum,3) class from dual connect by rownum <7)
select a.name,a.score,b.class from a, b where a.name = b.name
xieshengjun2009 2011-02-24
  • 打赏
  • 举报
回复
不一定非要在,报表中实现交叉,在数据库中做联合查询,直接返回给报表数据也行啊!

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧