在ORACLE10G中,遇到的一个动态增加列的问题。请各位高手帮忙看看,不胜感激。
现在的查询结果如下:
JH JH_ID ACC_JH AAC_ID
A A1 B B3
A A2 B B4
A A4 B B5
A A2 C C2
A A5 C C3
A A7 C C4希望的结果如下:
JH JH_ID ACC_JH AAC_ID ACC_JH1 AAC_ID2
A A1 B B3 C 0
A A2 B B4 C C2
A A3 B B5 C 0
A A4 B 0 C 0
A A5 B 0 C C3
A A6 B 0 C 0
A A7 B 0 C C4JH 列中,对于每一个元素(例如A),在ACC_JH列中,都有多个元素对应(例如B和C)。
现在希望:
ACC_JH列中对应A有几个元素,表的右边就有几列对应。如上图,B和C 2个元素对应A,则上表右边有2列ACC_JH 和 ACC_JH1 。请问大家有什么好的方法可以解决?

解决方案 »

  1.   


    with temp as
    (
    select 'A' a,'A1' b,'B' c,'B3' d from dual
    union all
    select 'A' ,'A2','B','B4' from dual
    union all
    select 'A','A3','B','B5' from dual
    union all
    select 'A','A4','C','C2' from dual
    union all
    select 'A','A5','C','C3' from dual
    union all
    select 'A','A6','C','C4' from dual
    )
    select 
    case when substr(b,1,1)='A' and length(b)=2 then a else 'A' end,
    case when substr(b,1,1)='A' and length(b)=2 then b end,
    case when substr(c,1,1)='B' and length(c)=1 then c else 'B' end,
    case when substr(d,1,1)='B' and length(d)=2 then d end,
    case when substr(c,1,1)='C' and length(c)=1 then c else 'C' end,
    case when substr(d,1,1)='C' and length(d)=2 then d end
     from temp
      

  2.   

    我也写一个SQL> with temp as
      2  (
      3  select 'A' a,'A1' b,'B' c,'B3' d from dual
      4  union all
      5  select 'A' ,'A2','B','B4' from dual
      6  union all
      7  select 'A','A3','B','B5' from dual
      8  union all
      9  select 'A','A4','C','C2' from dual
     10  union all
     11  select 'A','A5','C','C3' from dual
     12  union all
     13  select 'A','A6','C','C4' from dual
     14  union all
     15  select 'A' ,'A2','C','C2' from dual
     16  union all
     17  select 'A' ,'A4','B','B4' from dual
     18  )
     19   select a, b, 'B' c,nvl(max(decode(c, 'B', d)),'0') d,'C' e, nvl(max(decode
    (c, 'C', d)),'0') f from temp group by a, b order by a, b asc;A B  C D  E F
    - -- - -- - --
    A A1 B B3 C 0
    A A2 B B4 C C2
    A A3 B B5 C 0
    A A4 B B4 C C2
    A A5 B 0  C C3
    A A6 B 0  C C4已选择6行。
      

  3.   

    我觉得楼主的逻辑应该是
    select a.jh,a.jh_id,nvl(b.acc_jh,'B')acc_jh,
      nvl(b.aac_id,0)aac_id,nvl(c.acc_jh,'C')acc_jh1,
      nvl(c.aac_id,0)aac_id1 from(
    select 'A' jh,'A'||rownum Jh_id from dual
      connect by rownum<=(select substr(max(jh_id),2) from test_o))a
      left join (select * from test_o where acc_jh='B')b
      on a.jh_id=b.jh_id
      left join (select * from test_o where acc_jh='C')c
      on a.jh_id=c.jh_id
    order by a.jh_id  ;或
    select a.jh,a.jh_id,'B' acc_jh,
      max(decode(b.acc_jh,'B',b.aac_id,0))aac_id,
      'C' acc_jh1,
      max(decode(b.acc_jh,'C',b.aac_id,0))aac_id1 from(
    select 'A' jh,'A'||rownum Jh_id from dual
      connect by rownum<=(select substr(max(jh_id),2) from test_o))a
      left join test_o b
      on a.jh_id=b.jh_id
    group by a.jh,a.jh_id  
    order by a.jh_id  ;
    --原表
    JH JH_ID ACC_JH AAC_ID
    A A1 B B3
    A A2 B B4
    A A4 B B5
    A A2 C C2
    A A5 C C3
    A A7 C C4
    --结果
    JH JH_ID ACC_JH AAC_ID ACC_JH1 AAC_ID1
    A A1 B B3 C 0
    A A2 B B4 C C2
    A A3 B 0 C 0
    A A4 B B5 C 0
    A A5 B 0 C C3
    A A6 B 0 C 0
    A A7 B 0 C C4
      

  4.   

    谢谢楼上各位。
    小弟ORACLE菜鸟,对你们给的sql有点疑问。
    各位的sql中都硬编码了表中的字段具体内容,例如 ‘A'、‘B’、‘C’ 等等。
    但是,实际情况中字段内容是随时改变的啊。还请大家不胜赐教。
      

  5.   

    這里只是hardcode兩個一個是B一個是C因为这里不知道你横向的AAC_ID2和AAC_ID是不是根据ACC_JH中的B和C来判断的,如果不是通过这个判断,需要有个判断规则才能知道能不能写的出来哟。
      

  6.   

    昨天晚上回去好好学习了下。可还是不太明白。可能我对问题的表述不够清楚。
    实际上,我现在的表是2个表关联的查询结果。
    select  A.JH,  A.LTCH ,  B.RIGHT_DBJH,  B.RIGHT_LICH  from A , B 
    where A. LTCH  =  B.RIGHT_LICH JH     LTCH   RIGHT_DBJH   RIGHT_LTCH
    8B102 21 8B11      21
    8B102 3 8B11      22
    8B102 42-51 8B11    42-51
    8B102 21 8B16      21
    8B102 41*1 8B16      22
    8B102 42-51 8B16      3
    9C100 9 9C10      11
    9C100 10 9C10      10但是实际的需求的表格式如下:JH LTCH RIGHT_DBJH RIGHT_LTCH RIGHT_DBJH2 RIGHT_LTCH2
    8B102  21    8B11             21           8B16              21
    8B103  3    8B11             22           8B16               0
    8B104 42-51    8B11            42-51   8B16               3
    8B105 41*1    8B16             22           8B16               0
    9C100  9    9C10             11                       0
    9C100  10    9C10             10                       0JH列中,对于每个字段元素(例如8B102),在RIGHT_LTCH列中,都有多个元素对应(例如8B11和8B16)。JH列中可能存在几百个不同的元素,而在RIGHT_LICH中,又可能存在几十个元素与之对应。
    这也意味着表的右边可能有几十列(动态扩展)。看完大家的sql后,发现很多‘A’、‘B’、‘C’。我理解是JH 和 ACC_JH 中字段内容。
    但是这里的内容都是变化的啊。 JH 和 ACC_JH 都是有分组关系的啊。还请大家解答小弟困惑。
      

  7.   

    select a.jh,a.jh_id,'B' acc_jh,
      max(decode(b.acc_jh,'B',b.aac_id,0))aac_id,
      'C' acc_jh1,
      max(decode(b.acc_jh,'C',b.aac_id,0))aac_id1 from(
    select 'A' jh,'A'||rownum Jh_id from dual
      connect by rownum<=(select substr(max(jh_id),2) from test_o))a
      left join test_o b
      on a.jh_id=b.jh_id
    group by a.jh,a.jh_id  
    order by a.jh_id  ;狂浪兄弟,我按照你的代码测试。在 max(decode(b.acc_jh,'B',b.aac_id0))aac_id  的b.acc_id 提示“标识符无效”的错误。
      

  8.   


    你表名换过来了吗?
    test_o是我测试用的表
    如果还提示的话你检查下字段名是否书写正确
    还有你说可能有几十列的问题,再怎么简化你都得写几十个表名
    如果字段数不确定,要么你多写几列,没有的全置0,要么试试用Pl/sql
    'A','B'这些可以从表中提取,改下代码就好了,就是比较繁琐
      

  9.   

    'A','B'这些可以从表中提取,改下代码就好了,就是比较繁琐。这里始终不明白: 'A'、'B' 这些内容是从表中字段取出来的吗?
    如果是这样,表中字段内容随时都改变的啊。。
      

  10.   


    上面的代码没有做到这点,可以修改以达到这个目的
    原表中第一列的值固定不变,第三列的可以用分析函数row_number确定序号
    再在case中以这个序号代替'B','C'等