Oracle
 sql >> Database >  >> RDS >> Oracle

Discrepanza Oracle SQL:COUNT(*) rispetto al set di risultati effettivi

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)

Sono passato ai join esterni completi in modo da poter verificare che non ci siano successi e/o errori senza alcun tentativo di corrispondenza. Questo dovrebbe farti trovare e_id s dove qualcosa non va nella registrazione. Dovrebbe essere più facile iniziare a gestire numeri più fini e non solo elenchi di valori id.

Altri hanno sottolineato il potenziale per più tentativi sullo stesso ID, ma è concepibile che un successo e un fallimento possano essere registrati entrambi allo stesso modo, ad esempio in una sorta di scenario di tentativi? Non sappiamo come siano i commenti completi. Come possibile spiegazione, un singolo commento può contenere più di una delle parole "tentativo", "successo", "fallimento"?

Ecco qualcos'altro da considerare: Sei sicuro che tutti i tuoi eventi di successo e fallimento rientrino nella stessa finestra di data? In altre parole, c'è qualche ritardo dopo il tentativo? Potrebbe non essere necessario molto tempo se ciò accade intorno a mezzanotte. Potresti voler ampliare gli intervalli di successo e fallimento abbastanza per compensare questo (e passare ai join esterni sinistro).

Nota: Condizione nel where la clausola è stata modificata per consentire più tentativi (come indicato nei commenti) e ora cerca solo un equilibrio nel numero di tentativi rispetto a successi e fallimenti.