corp_id   corp_name    value       date 
   1         1-1        2.1     2008-11-11
   1         1-1        2.3     2008-11-12
   1         1-1        2.5     2008-11-13我现在希望将格式转化成corp_id   corp_name    2008-11-11     2008-11-12     2008-11-13
   1         1-1          2.1             2.3           2.5    
希望高手们能赐教。给个解决的思路和方案。。谢谢 

解决方案 »

  1.   

    行列转换,有被我碰到了:)create table t(corp_id number, corp_name varchar2(20),   value number,     dt varchar2(20));
     insert into t values( 1   ,     '1-1',        2.1 ,   '2008-11-11');                                                               
     insert into t values( 1   ,     '1-1',        2.3 ,   '2008-11-12');                                                               
     insert into t values( 1   ,     '1-1',        2.5 ,   '2008-11-13'); 
    SQL> select corp_id,
      2         corp_name,
      3         max(decode(dt, '2008-11-11', value)) "2008-11-11",
      4         max(decode(dt, '2008-11-12', value)) "2008-11-12",
      5         max(decode(dt, '2008-11-13', value)) "2008-11-13"
      6    from t
      7   group by corp_id, corp_name;
     
       CORP_ID CORP_NAME            2008-11-11 2008-11-12 2008-11-13
    ---------- -------------------- ---------- ---------- ----------
             1 1-1                         2.1        2.3        2.5
                                
                                                                  
      

  2.   

    行列转换就是max+decode或者sum+decode。我给的例子的值date是varchar2类型的,如果你是date类型相应的要修改一下。
      

  3.   

    corp_id  corp_name    value      date 
      1        1-1        2.1    2008-11-11 
      1        1-1        2.3    2008-11-12 
      1        1-1        2.5    2008-11-13 
      2        2-1        3.3    2008-11-11
      2        2-1        2.3    2008-11-12
      2        2-1        2.4    2008-11-13
     ...       ...        ...    .........我现在希望将格式转化成 corp_id  corp_name    2008-11-11    2008-11-12    2008-11-13 ....     2008-11-17
      1        1-1          2.1            2.3          2.5       ....     .....
    注意:我的数据是要求 距当天前七天的数据
      

  4.   

    本人认为你写的这个SQL对他的问题来说就是废品。
    这个dt列应该是随着数据库的数据变化的
      

  5.   

    给你个思路吧,因为没又测试数据所以没写完
    select corp_id,
           corp_name,
           max(decode(dt,to_char(sysdate  - 1, 'yyyy-mm-dd'), value))  ,
           max(decode(dt, to_char(sysdate - 2, 'yyyy-mm-dd'), value)),
           max(decode(dt, to_char(sysdate - 3 , 'yyyy-mm-dd'), value)) 
      from (select *
              from t
             where t.dt in (select to_char(sysdate - rownum + 1, 'yyyy-mm-dd') dd
                               from dual
                             connect by rownum <= 7) )
     group by corp_id, corp_name;
    首先用这个条件t.dt in (select to_char(sysdate - rownum + 1, 'yyyy-mm-dd') dd
                               from dual
                             connect by rownum <= 7)
    把七天之内的数据过滤出来,然后再用max(decode),至于max(decode)已给你例子。
      

  6.   

    小伙子,你说话太绝了把,只要楼主给我足够的测试数据,我完全可以用这种方法做出来。再说,你没看到楼主再3楼的帖子你可以凭你的第八感能预测到楼主会说当前七天的数据啊。
    还废品呢。就跟你是oracle大师似的....
      

  7.   

    呵呵。。以和为贵。。谢谢 linzhangs 我测试通过了就给你散分
      

  8.   


    SQL> select corp_id,
      2         corp_name,
      3         (select val from table where data = '2008-11-11') as 2008-11-11,
      4         (select val from table where data = '2008-11-12') as 2008-11-12,
      5         (select val from table where data = '2008-11-13') as 2008-11-13
      7   group by corp_id, corp_name;
      

  9.   

    SQL> create table t(id int,name varchar2(4),value number(2,1),d date);表已创建。
    SQL> select * from t;        ID NAME      VALUE D
    ---------- ---- ---------- --------------
             1 1-1         2.1 27-12月-08
             1 1-1         2.2 28-12月-08
             1 1-1         2.3 29-12月-08
    SQL> select t.id,t.name,max(t1.value),max(t2.value),max(t3.value) from t
      2  left join (select id,value,d from t where d<sysdate-1 and d>sysdate-2) t1 on t.id=t1.id and t.d=t1.d
      3  left join (select id,value,d from t where d<sysdate-2 and d>sysdate-3) t2 on t.id=t2.id and t.d=t2.d
      4  left join (select id,value,d from t where d<sysdate-3 and d>sysdate-4) t3 on t.id=t3.id and t.d=t3.d
      5  where t.id=1 group by t.id,t.name
      6  /        ID NAME MAX(T1.VALUE) MAX(T2.VALUE) MAX(T3.VALUE)
    ---------- ---- ------------- ------------- -------------
             1 1-1            2.3           2.2           2.1
      

  10.   

    感谢linzhangs 和 wffffc 两种方法都可以解决我的问题。。谢谢