Oracle查询[需要子查询?]

时间:2019-05-31 07:24:43

标签: oracle

假设我有下表:

NUM  TYPE  STAT   ERR
123   10      6    62
123   10      6    62
123   10      6    62
123   17      4     0
321   10      6    62
321   10      6    62

我当前正在使用以下查询:

select MIN(NUM) as NUMBER
     , MIN(STAT) as STATUS
     , MIN(ERR) as ERROR
     , MIN(retry) as RETRY 
 from TABLE_TB 
where ERR=62 
group by NUM 
having count(ERR) > 1;

输出将是:

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3
321   10      6    62      2

没关系,但是我需要的是查询将仅输出NUM,具有ERR = 62,但也具有ERR = 0,排除那些具有ERR = 62但不具有ERR = 0的人。以第一个表为例,查询应该输出

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3

这是因为NUM 123的ERR = 62(发生3次)而且ERR = 0。因此,NUM 321将被排除,因为即使ERR = 62,也没有ERR = 0。

希望是未来:)

非常感谢。 卢卡斯

3 个答案:

答案 0 :(得分:1)

您可以使用子查询:

SELECT num
     , MIN(type) AS type
     , MIN(stat) AS status
     , MIN(err) AS err
     , COUNT(*) AS retry
FROM table_tb
WHERE err != 0 AND
      num IN (SELECT num FROM tb WHERE err = 0)
GROUP BY num;

或不使用子查询:

SELECT num
     , MIN(CASE WHEN err != 0 THEN type END) AS type
     , MIN(CASE WHEN err != 0 THEN stat END) AS stat
     , MIN(CASE WHEN err != 0 THEN err END) AS err
     , COUNT(CASE WHEN err != 0 THEN 1 END) AS retry
FROM table_tb
GROUP BY num
HAVING COUNT(DECODE(err, 0, 1)) > 0;

输出:

+-----+------+------+-----+-------+
| NUM | TYPE | STAT | ERR | RETRY |
+-----+------+------+-----+-------+
| 123 |   10 |    6 |  62 |     3 |
+-----+------+------+-----+-------+

答案 1 :(得分:1)

您需要首先过滤err in (62, 0)上的表,然后找到您有多少种不同的错误类型(您需要2种,因为您有两个感兴趣的错误代码)。

一旦有了这些信息,就可以过滤err = 62且非重复计数= 2的行-例如:

WITH results as (select num,
                        type,
                        stat,
                        err,
                        retry,
                        count(distinct err) over (partition by num) num_err_types
                 from   table_tb
                 where  err in (62, 0))
select min(num) as nmbr,
       min(stat) as status,
       min(err) as ERROR,
       min(retry) as retry
from   results
where  err = 62
and    num_err_types = 2;

我使用了COUNT()分析函数来查找不同的计数-这样,无论错误代码如何,都将值添加到每一行,这使我们能够在最终查询中对其进行过滤。

答案 2 :(得分:1)

或者您可以尝试这种简单而甜蜜的方式...

select MIN(NUM) as NUMBER
     , MIN(STAT) as STATUS
     , MAX(ERR) as ERROR
     , Count(*) as RETRY 
 from TestTable 
where ERR IN (62 ,0)
group by NUM 
having count(ERR) > 1 AND MIN(ERR)=0;