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.