1
votes

Requête Oracle [besoin d'une sous-requête?]

en supposant que j'ai le tableau suivant:

NUM  TYPE  STAT   ERR  RETRY
123   10      6    62      3

J'utilise actuellement la requête suivante:

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

Le résultat sera:

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;

C'est correct, mais ce dont j'ai besoin, c'est que la requête ne produira que NUM WITH ERR = 62 mais aussi avec ERR = 0 à l'exclusion ont ERR = 62 mais sans ERR = 0. En prenant le premier tableau comme exemple, la requête doit afficher

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

Ceci car NUM 123 a ERR = 62 (3 occurrency) mais aussi ERR = 0. Donc, NUM 321 sera exclu car même s'il a ERR = 62, il n'a pas ERR = 0.

L'espoir est clair :)

Merci beaucoup. Lucas


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser une sous-requête:

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

ou vous passer d'une sous-requête:

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;

Résultat:

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;


1 commentaires

Merci de me montrer l'exemple de sous-requête (et sans sortie). Je dois encore l'essayer, mais le concept est clair.



1
votes

Vous devez d'abord filtrer le tableau sur err in (62, 0) , puis rechercher le nombre de types d'erreur distincts que vous avez (vous en voulez 2, car vous avez deux codes d'erreur que vous intéressé par).

Une fois que vous avez cette information, vous pouvez ensuite filtrer sur les lignes où l'erreur = 62 et le nombre distinct = 2 - par exemple:

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;

J'ai utilisé la fonction analytique COUNT () pour trouver le décompte distinct - de cette façon, la valeur est ajoutée à chaque ligne, quel que soit le code d'erreur, ce qui nous permet de filtrer dessus dans la requête finale.


1 commentaires

Merci, cela me semble un peu compliqué, mais je vais l'essayer bientôt en espérant pouvoir le comprendre.



1
votes

Ou peut-être pouvez-vous essayer de cette façon, simple et douce ...

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;


1 commentaires

Merci, oui c'est très simple et il semble que cela fonctionne parfaitement!