zoukankan      html  css  js  c++  java
  • Pivot a result set

    You Asked

    Hi Tom,
    I have two tables which are a 1 - M relationship.
    I have a user who want a horizontal view of the
    data.
    
    For instance,
    Table A
    Key-1 char(3);
    table A values
    _______
    1
    2
    3
    
    
    Table B
    bkey-a char(3);
    bcode  char(1);
    table b values
    1 T
    1 A
    1 G
    2 A
    2 T
    2 L
    3 A
    
    What he wants to see is
    all matches between the tables
    where the code
    is "T" "A" or "L":
    1, T, A
    2, A, T, L
    3, A
    
    I have tried joining the tables to themselves 
    and doing an outer join but I end up
    with multiple rows.
    1, T
    1, A
    2  a
    2  t
    2  l
    3  a 
    etc
    
    Is this possible?
    
     

    and we said...

    Sure, using decode to transpose columns like this is fairly straightforward.  I'll do it 
    in 2 steps so you can see how it is done.
    
    We start by joining A to B and creating a 'sparse' matrix.  We'll then "squash out" the 
    redundant rows giving us the desired effect.
    
    ops$tkyte@8i> select key_1,
      2             decode( bcode, 'T', bcode, null ) t_code,
      3             decode( bcode, 'A', bcode, null ) a_code,
      4             decode( bcode, 'L', bcode, null ) l_code
      5    from a, b
      6   where a.key_1 = b.bkey_a
      7  /
    
    KEY T A L
    --- - - -
    1   T
    1     A
    1
    2     A
    2   T
    2       L
    3     A
    
    7 rows selected.
    
    
    So, there is our 'sparse' matrix.  What we want to do now is collapse the rows by key_1.  
    Thats what group by does for us:
    
    
    ops$tkyte@8i> 
    ops$tkyte@8i> select key_1,
      2             max(decode( bcode, 'T', bcode, null )) t_code,
      3             max(decode( bcode, 'A', bcode, null )) a_code,
      4             max(decode( bcode, 'L', bcode, null )) l_code
      5    from a, b
      6   where a.key_1 = b.bkey_a
      7   group by key_1
      8  /
    
    KEY T A L
    --- - - -
    1   T A
    2   T A L
    3     A
    
    
    You could add a where clause in the event you have a row in A, such there no rows in B 
    have the value T, A, L.  EG:
    
    ops$tkyte@8i> insert into a values ( '4' );
    ops$tkyte@8i> insert into b values ( '4', 'Z' );
    
    ops$tkyte@8i> select key_1,
      2             max(decode( bcode, 'T', bcode, null )) t_code,
      3             max(decode( bcode, 'A', bcode, null )) a_code,
      4             max(decode( bcode, 'L', bcode, null )) l_code
      5    from a, b
      6   where a.key_1 = b.bkey_a
      7   group by key_1
      8  /
    
    KEY T A L
    --- - - -
    1   T A
    2   T A L
    3     A
    4                  <<<<<====== you might not want that row (maybe you do?)
    
    ops$tkyte@8i> select key_1,
      2             max(decode( bcode, 'T', bcode, null )) t_code,
      3             max(decode( bcode, 'A', bcode, null )) a_code,
      4             max(decode( bcode, 'L', bcode, null )) l_code
      5    from a, b
      6   where a.key_1 = b.bkey_a
      7     and b.bcode in ( 'T', 'A', 'L' )    <<<<<====== that'll get rid of it.
      8   group by key_1
      9  /
    
    KEY T A L
    --- - - -
    1   T A
    2   T A L
    3     A
    
    
  • 相关阅读:
    Linux命令:ls
    Log4j:log4j.properties 配置解析
    PostgreSQL: WITH Queries (Common Table Expressions)
    Linux使用SecureCRT上传下载
    PostgreSQL 自动输入密码
    Linux命令:rmdir
    Linux命令:mkdir
    Linux命令:pwd
    Linux命令:cd
    正则表达式 
  • 原文地址:https://www.cnblogs.com/tracy/p/2107633.html
Copyright © 2011-2022 走看看