Oracle
 sql >> Base de données >  >> RDS >> Oracle

Écart Oracle SQL :COUNT(*) par rapport à l'ensemble de résultats réel

SELECT
    a.e_id,
    coalesce(attempts, 0) attempts,
    coalesce(successes, 0) successes,
    coalesce(failures, 0) failures
FROM
    (
        SELECT e_id, count(*) as attempts FROM e_table
        WHERE e_comment LIKE '%attempt%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) a
    full outer join
    (
        SELECT e_id, count(*) as successes FROM e_table
        WHERE e_comment LIKE '%success%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) s
        on s.e_id = a.e_id
    full outer join
    (
        SELECT e_id, count(*) as failures FROM e_table
        WHERE e_comment LIKE '%failure%' AND e_date BETWEEN '23-MAY-2016' AND '26-MAY-2016'
        GROUP BY e_id
    ) f
        on f.e_id = coalesce(a.e_id, s.e_id)
WHERE
    coalesce(attempts, 0) <> coalesce(successes, 0) + coalesce(failures, 0)

J'ai changé pour des jointures externes complètes afin que vous puissiez vérifier qu'il n'y a pas de succès et/ou d'échecs sans aucune tentative de correspondance. Cela devrait vous permettre de trouver e_id s où quelque chose ne va pas dans la journalisation. Il devrait être plus facile de commencer à traiter des nombres plus fins et pas seulement des listes de valeurs d'identifiant.

D'autres ont souligné le potentiel de tentatives multiples sur le même identifiant, mais est-il concevable qu'un succès et un échec puissent tous deux être enregistrés de la même manière que dans une sorte de scénario de nouvelle tentative ? Nous ne savons pas à quoi ressemblent les commentaires complets. Comme explication possible, un même commentaire peut-il contenir plus d'un des mots "tentative", "succès", "échec" ?

Voici autre chose à considérer : Êtes-vous sûr que tous vos événements de réussite et d'échec se situeront dans la même fenêtre de dates ? En d'autres termes, y a-t-il un délai après la tentative ? Cela ne devrait pas être très long si cela se produit vers minuit. Vous voudrez peut-être élargir suffisamment les plages de réussite et d'échec pour compenser cela (et passer aux jointures externes gauches.)

Remarque : Condition dans le where La clause a été modifiée pour permettre plusieurs tentatives (comme indiqué dans les commentaires) et cherche maintenant un équilibre entre le nombre de tentatives par rapport aux succès et aux échecs.