Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Rozbieżność Oracle SQL:COUNT(*) a rzeczywisty zestaw wyników

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)

Zmieniłem na pełne złączenia zewnętrzne, aby można było sprawdzić, czy nie ma sukcesów i/lub niepowodzeń bez próby dopasowania. To powinno pozwolić ci znaleźć e_id s tam, gdzie podczas rejestrowania dzieje się coś złego. Powinno być łatwiej zacząć zajmować się dokładniejszymi liczbami, a nie tylko listami wartości identyfikatorów.

Inni wskazywali na możliwość wielokrotnych prób na tym samym identyfikatorze, ale czy można sobie wyobrazić, że zarówno sukces, jak i porażka mogą być rejestrowane w taki sam sposób, jak powiedzmy w jakimś scenariuszu ponawiania? Nie wiemy, jak wyglądają pełne komentarze. Jako możliwe wyjaśnienie, czy pojedynczy komentarz może zawierać więcej niż jedno ze słów „próba”, „sukces”, „porażka”?

Oto jeszcze coś do rozważenia: Czy jesteś pewien, że wszystkie Twoje sukcesy i porażki przypadają w tym samym przedziale czasowym? Innymi słowy, czy jest jakieś opóźnienie po próbie? Może to nie potrwać bardzo długo, jeśli nastąpi to około północy. Możesz chcieć poszerzyć zakresy sukcesów i niepowodzeń na tyle, aby to zrekompensować (i zmienić na lewe sprzężenia zewnętrzne).

Uwaga: Warunek w where Klauzula została zmodyfikowana, aby umożliwić wielokrotne próby (jak zauważono w komentarzach), a teraz po prostu szuka równowagi między liczbą prób a sukcesami i porażkami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać dane z dwóch kolumn w formacie A, B w Oracle?

  2. REGEX, aby wybrać n-tą wartość z listy, pozwalając na wartości null

  3. Znajdź rekordy z nakładającym się zakresem dat w SQL

  4. Reader.Read() nie odczytuje wierszy, mimo że ma wiersze

  5. Jak zastąpić wartości null tekstem?