Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Discrepância do Oracle SQL:COUNT(*) vs Conjunto de Resultados Real

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)

Mudei para junções externas completas para que você possa verificar se não há sucessos e/ou falhas sem qualquer tentativa de correspondência. Isso deve permitir que você encontre e_id s onde algo está errado no registro. Deve ser mais fácil começar a lidar com números mais finos e não apenas listas de valores de id.

Outros apontaram o potencial de várias tentativas no mesmo id, mas é concebível que um sucesso e uma falha possam ser registrados da mesma maneira que, digamos, em algum tipo de cenário de repetição? Não sabemos como são os comentários completos. Como possível explicação, um único comentário pode conter mais de uma das palavras "tentativa", "sucesso", "fracasso"?

Aqui está outra coisa a considerar: Você tem certeza de que todos os seus eventos de sucesso e fracasso cairão na mesma janela de data? Em outras palavras, há algum atraso após a tentativa? Pode não demorar muito se isso acontecer por volta da meia-noite. Você pode querer ampliar os intervalos de sucesso e falha o suficiente para compensar isso (e mudar para junções externas à esquerda).

Observação: Condição no where A cláusula foi modificada para permitir várias tentativas (como observado nos comentários) e agora apenas procura um equilíbrio no número de tentativas versus sucessos e falhas.