有个报表是这样的: 
A 表:  时间(yy-mm-dd hh24:mi:ss)  状态编码  业务流水号 等字段 B 表 :  状态编码  状态名 要求统计出某时间段内 各个状态发生业务的笔数,大致效果如下 
    时间    状态名1  状态名2  状态名3  状态名4  状态名5.... 
  2008-10-01  5笔      6笔      5笔        0...... 
  ....   2008-10-31  2笔      ........ 
不知道什么做,由于只有几种状态 我就用 
SELECT  TO_CHAR(DATE , 'YYYY--MM--DD') SUM(CASE  WHEN STATUS= '01' THEN 1 ELSE 0 END ) 
AS  状态名1 ,.......FROM A表 WHERE 时间条件 GROUP BY  TO_CHAR(DATE , 'YYYY--MM--DD') 
但是只能静态的实现,如果状态增加,语句就变了,JDBC我会实现,IBATIS该如何弄?存储过程??数据库为ORCALE 
 
 
 
问题点数: 

解决方案 »

  1.   

    象这种问题,我看到过高手都用decode和over函数处理参考:
    http://lengyue.javaeye.com/blog/195441
      

  2.   

    以前类似这样的不定行转列好象没看到多少解决的SQL.现借鉴前辈的思路做的,觉得不错,供参考.SQL> select * from a;SJ          ZTBM       LSH
    ----------- ---------- ----------
    2008-10-1   1001       20080001
    2008-10-1   1001       20080002
    2008-10-1   1002       20080003
    2008-10-1   1003       20080004
    2008-10-1   1003       20080005
    2008-10-2   1002       20080006
    2008-10-2   1002       20080007
    2008-10-2   1001       200800088 rows selectedSQL> select * from b;ZTBM       ZTM
    ---------- --------------------
    1001       状态名1
    1002       状态名2
    1003       状态名3
    1004       状态名4SQL> 
    SQL> create or replace procedure proc_test as
      2    cursor cur_b is
      3      select * from b;
      4    v_sql varchar2(2000);
      5    i     number;
      6  begin
      7    v_sql := 'create or replace view view_sleepzzzzz as select to_char(sj,''yyyy-mm-dd'') sj,';
      8    for c_temp in cur_b loop
      9      v_sql := v_sql || 'sum(decode(ztbm,''' || c_temp.ztbm || ''',1,0)) ' ||
     10               c_temp.ztm || ',';
     11    end loop;
     12    v_sql := substr(v_sql, 1, length(v_sql) - 1) || ' from a group by to_char(sj,''yyyy-mm-dd'')';
     13    execute immediate v_sql;
     14  end proc_test;
     15  /Procedure createdSQL> exec proc_test;PL/SQL procedure successfully completedSQL> select * from view_sleepzzzzz;SJ             状态名1    状态名2    状态名3    状态名4
    ----------- ---------- ---------- ---------- ----------
    2008-10-1            2          1          2          0
    2008-10-2            1          2          0          0
    /* -- 以下是动态增加一个状态测试
    SQL> select * from b;ZTBM       ZTM
    ---------- --------------------
    1001       状态名1
    1002       状态名2
    1003       状态名3
    1004       状态名4
    1005       状态名5SQL> exec proc_test;PL/SQL procedure successfully completedSQL> select * from view_sleepzzzzz;SJ             状态名1    状态名2    状态名3    状态名4    状态名5
    ----------- ---------- ---------- ---------- ---------- ----------
    2008-10-1            2          1          2          0          0
    2008-10-2            1          2          0          0          0SQL> 
    */
      

  3.   

    sleeep现在越发犀利了啊1!!!崇拜Ing~~
      

  4.   


    ibatis和jdbc有什么差别呀,你这里可以用jdbc做,当然就可以用ibatis做,用HashMap做resultClass就可以了。