sql >> Database >  >> RDS >> Oracle

Oracle SQL-afwijking:COUNT(*) versus werkelijke resultatenset

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)

Ik ben overgestapt op volledige outer joins, zodat je kunt controleren of er geen successen en/of mislukkingen zijn zonder een poging tot matching. Hiermee zou je e_id . moeten kunnen vinden s waar er iets fout gaat in de logging. Het zou gemakkelijker moeten zijn om met fijnere getallen om te gaan en niet alleen met lijsten van ID-waarden.

Anderen hebben gewezen op het potentieel voor meerdere pogingen op dezelfde id, maar is het denkbaar dat een succes en een mislukking beide op dezelfde manier kunnen worden vastgelegd, bijvoorbeeld in een soort scenario voor opnieuw proberen? We weten niet hoe de volledige opmerkingen eruit zien. Kan een enkele opmerking, als mogelijke verklaring, meer dan één van de woorden "poging", "succes", "mislukking" bevatten?

Hier is nog iets om over na te denken: Weet u zeker dat al uw succes- en mislukkingsgebeurtenissen binnen hetzelfde datumvenster vallen? Met andere woorden, is er enige vertraging na de poging? Het hoeft misschien niet lang te duren als dit rond middernacht gebeurt. Misschien wilt u het succes- en mislukkingsbereik voldoende verbreden om dit te compenseren (en veranderen naar left outer joins.)

Opmerking: Voorwaarde in de where clausule is aangepast om meerdere pogingen mogelijk te maken (zoals vermeld in opmerkingen) en zoekt nu alleen naar een balans in het aantal pogingen versus successen en mislukkingen.



  1. De beste manier om veilig verbinding te maken met MySQL met PHP

  2. ORA-24247:netwerktoegang geweigerd door toegangscontrolelijst (ACL)

  3. Bestanden in een map weergeven met SQL Server

  4. Hoe volledige gegevens van het record op te halen met de externe sleutel in laravel?