sql >> Base de Datos >  >> RDS >> Oracle

Discrepancia de Oracle SQL:COUNT(*) frente al 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)

Cambié a uniones externas completas para que pueda verificar que no hay éxitos y/o fallas sin ningún intento de coincidencia. Esto debería permitirle encontrar e_id s donde algo va mal en el registro. Debería ser más fácil comenzar a trabajar con números más finos y no solo con listas de valores de identificación.

Otros han señalado el potencial de múltiples intentos en la misma identificación, pero ¿es concebible que tanto un éxito como un fracaso puedan registrarse de la misma manera que, por ejemplo, en algún tipo de escenario de reintento? No sabemos cómo son los comentarios completos. Como posible explicación, ¿puede un solo comentario contener más de una de las palabras "intento", "éxito", "fracaso"?

Aquí hay algo más a considerar: ¿Está seguro de que todos sus eventos de éxito y fracaso se encontrarán dentro de la misma ventana de fecha? En otras palabras, ¿hay algún retraso después del intento? Puede que no tenga que ser muy largo si esto sucede alrededor de la medianoche. Es posible que desee ampliar los rangos de éxito y fracaso lo suficiente para compensar esto (y cambiar a combinaciones externas izquierdas).

Nota: Condición en el where La cláusula se ha modificado para permitir múltiples intentos (como se indica en los comentarios) y ahora solo busca un equilibrio en la cantidad de intentos frente a éxitos y fallas.