表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里怎么实现?

解决方案 »

  1.   

    在你实现第一问题的基础上,查询后返回数据就可以吧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
      

  2.   

    已经实现,结帖吧,散分了.个人总结:
    如果科目是固定的,就用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上固定列.