为不同列上的不同值选择相同的列

时间:2016-10-03 20:44:58

标签: oracle

我在发布之前搜索了论坛,发现了一些接近同一问题的主题,但我仍有疑问,所以我在这里发帖。

EMP_ID  SEQ_NR  NAME
874830  3       JOHN                
874830  4       JOE         
874830  21      MIKE       
874830  22      BILL
874830  23      ROBERT
874830  24      STEVE
874830  25      JERRY

我的输出应该是这样的。

EMP ID SEQ3NAME SEQ4NAME SEQ21NAME SEQ22NAME SEQ23NAME SEQ24NAME SEQ25NAME
874830 JOHN     JOE      MIKE      BILL      ROBERT     STEVE    JERRY

SELECT A.EMP_ID
      ,A.NAME SEQ3NAME 
      ,B.NAME SEQ4NAME 
FROM AC_XXXX_CONTACT A 
INNER JOIN AC_XXXX_CONTACT B ON A.EMP_ID = B.EMP_ID 
WHERE A.SEQ_NR = '03' AND B.SEQ_NR = '04'
AND B.EMP_ID = '874830';

以上查询帮助我获得了以下结果。

EMP_ID  SEQ3NAME SEQ4NAME 
874830  JOHN     JOE

我的问题是,如果我再加入桌子5次,可以获得所有字段(即直到seq nr = 25)。

有更好的方法来获得结果吗?

我正在查询Oracle DB

感谢您的帮助。

新要求

New Input

STU-ID SEM    CRS-NBR
12345   1     100
12345   1     110 
12345   2     200 

New Output

stu-id crs1  crs2
12345  100   200
12345  110  

1 个答案:

答案 0 :(得分:3)

未测试,因为您没有提供测试数据(来自表AC_XXXX):
(使用Oracle 11 PIVOT子句)

select *
from   ( select emp_id, seq_nr, name
         from   ac_xxxx
         where  emp_id = '874830' )
pivot ( max(name) for seq_nr in (3 as seq3name, 4 as seq4name, 21 as seq21name,
                      22 as seq22name, 23 as seq23name, 24 as seq24name, 25 as seq25name)
      )
;

对于Oracle 10或更早版本,透视是“手动”完成的,如下所示:

select max(emp_id) as emp_id,               --  Corrected based on comment from OP
       max(case when seq_nr = 3 then name end) as seq3name,
       max(case when seq_nr = 4 then name end) as seq4name,
    --   etc. (similar expressions for the other seq_nr)
from   ac_xxxx
where  emp_id = '874830'
;

或者,emp_id如果我们添加max(),则group by emp_id不需要在-Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -Dorg.eclipse.jetty.LEVEL=DEBUG 范围内 - 即使没有WHERE子句也可以使用$.post(server_url, params, my_callback, "json") 来解决另一个但相关的问题。