Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL-Diskrepanz:COUNT(*) vs. Actual Resultset

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)

Ich habe auf vollständige äußere Verknüpfungen umgestellt, damit Sie überprüfen können, ob es ohne Übereinstimmungsversuch keine Erfolge und/oder Fehler gibt. Damit sollten Sie e_id finden s wo etwas in der Protokollierung schief läuft. Es sollte einfacher sein, mit feineren Zahlen umzugehen und nicht nur mit Auflistungen von ID-Werten.

Andere haben auf das Potenzial für mehrere Versuche mit derselben ID hingewiesen, aber ist es vorstellbar, dass sowohl ein Erfolg als auch ein Misserfolg auf die gleiche Weise aufgezeichnet werden könnten, wie beispielsweise in einer Art Wiederholungsszenario? Wir wissen nicht, wie die vollständigen Kommentare aussehen. Kann ein einzelner Kommentar als mögliche Erklärung mehr als eines der Wörter „Versuch“, „Erfolg“, „Misserfolg“ enthalten?

Hier ist noch etwas zu beachten: Sind Sie sicher, dass alle Ihre Erfolgs- und Misserfolgsereignisse in dasselbe Datumsfenster fallen? Mit anderen Worten, gibt es nach dem Versuch eine gewisse Verzögerung? Es kann nicht lange dauern, wenn dies gegen Mitternacht geschieht. Möglicherweise möchten Sie die Erfolgs- und Fehlerbereiche ausreichend erweitern, um dies auszugleichen (und zu Left Outer Joins wechseln).

Hinweis: Bedingung im where -Klausel wurde geändert, um mehrere Versuche zuzulassen (wie in den Kommentaren angegeben) und sucht jetzt nur nach einem Gleichgewicht zwischen der Anzahl der Versuche und den Erfolgen und Fehlern.