为不同列上的不同值选择相同的列,然后对其进行过滤

时间:2016-10-25 19:49:42

标签: oracle

我的问题与我的这个旧查询有关。我有一个额外的要求,因此这个问题。

Select same column for different values on a different column

下面是我的表格,我的要求是找到以' J'开头的seq3name。然后还为同一名员工选择相应的SEQ4NAME。

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

SELECT EMP_ID
       MAX(CASE WHEN SEQ_NR = 3 THEN NAME END) AS SEQ3NAME
       MAX(CASE WHEN SEQ_NR = 4 THEN NAME END) AS SEQ4NAME
FROM   AC_XXXXX
WHERE SEQ_NR = '3' AND NAME LIKE '%J';

期望输出

EMP_ID  SEQ3NAME  SEQ4NAME
874830  JOHN      NOE 

但是这里的问题我把seq4name称为NULL。你能告诉我们一个解决方案,我们可以得到Seq4name吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

据我了解,您尝试查找name首字母为'J'的所有行。如果是这样,您需要NAME LIKE 'J%'而不是相反。 除了使用SEQ_NR = 3限制行外,这意味着结果集中没有任何行SEQ_NR = 4

我认为,你应该使用类似的东西:

SELECT EMP_ID
       MAX(CASE WHEN SEQ_NR = 3 THEN NAME END) AS SEQ3NAME
       MAX(CASE WHEN SEQ_NR = 4 THEN NAME END) AS SEQ4NAME
FROM   AC_XXXXX
WHERE SEQ_NR =ANY(3,4) 
 AND NAME LIKE 'J%'
 GROUP BY EMP_ID; 

编辑另一种解决方案

SELECT EMP_ID
       MAX(CASE WHEN SEQ_NR = 3 AND NAME LIKE 'J%' THEN NAME END) AS SEQ3NAME
       MAX(CASE WHEN SEQ_NR = 4 THEN NAME END) AS SEQ4NAME
FROM   AC_XXXXX e
WHERE SEQ_NR =ANY(3,4) 
  AND EXISTS (select null 
               from AC_XXXXX se
              where e.EMP_ID = se.EMP_ID
                AND NAME LIKE 'J%')
 GROUP BY EMP_ID;