1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Zweimal Count mit einer Anweisung ausgeben

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von gurbelunder, 1 November 2013.

  1. gurbelunder

    gurbelunder Datenbank-Guru

    Hi zusammen,

    heute hab ich mal eine Frage an euch. Ich habe gerade einen SQL Hänger.

    Ich habe eine Tabelle, in der eine Art Protokollierung zu Jobs läuft. Vereinfacht sieht das so aus:

    Code:
    CREATE TABLE protokoll
    (
       id number NOT NULL,
       status varchar(20) NOT NULL,
       details varchar(100)
    )
    
    Status bekommt den Wert "SUCCSEEDED" oder "FAILED" zugewiesen.

    Nun möchte ich in einem Skript eine Zusammenfassung einbauen, die mir alle erfolgreichen und alle fehlerhaften zählt. Vom Aussehen stelle ich es mir so vor:

    Code:
    Erfolgreich | Fehlerhaft
    --------------------------
                   10 |                 5
    
    Bis hier hin komme ich ohne Probleme:

    Code:
    select COUNT(STATUS) from protokoll where status like 'SUCCEEDED';
    
    Als Gegensatz dann natürlich:
    Code:
    select COUNT(STATUS) from protokoll where status like 'FAILED';
    
    Wie bekomme ich beide Abfragen aber nun zusammen? Mir schwirren MINUS und UNION und sollte Operatoren im Kopf rum. Aber UNION würde beide Werte in einer Spalte zusammenfassen und MINUS gibt nur die Differenz zwischen beiden aus.

    Ich habe gerade eine totale Blockade. Habt ihr eine Idee?

    Danke euch und Gruß,
    David
     
  2. gurbelunder

    gurbelunder Datenbank-Guru

    Wie das so ist, bei einer Blockade tief durch atmen.... Hab mir selbst die Lösung gefunden. Vielleicht nicht die schönste Variante, hilft aber:

    Code:
    select 'Erfolgreich ' || COUNT(STATUS) AS Zusammenfassung from protokoll where status not like 'SUCCEEDED'
    UNION
    select 'Fehlerhaft ' || COUNT(STATUS) from protokoll where status like 'SUCCEEDED';
    
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# \d gurbelunder
      Table "public.gurbelunder"
     Column |  Type  | Modifiers
    --------+---------+-----------
     status | boolean |
    
    test=*# select * from gurbelunder ;
     status
    --------
     f
     f
     f
     t
     t
     t
     t
     t
     t
    (9 rows)
    
    Time: 0,179 ms
    test=*# select sum(case when status then 1 else 0 end) as true, sum(case when status then 0 else 1 end) as false from gurbelunder;
     true | false
    ------+-------
      6 |  3
    (1 row)
    
    Deine UNION - Lösung ist schlecht, sie liefert es in 2 Zeilen, außerdem braucht sie 2 Durchläufe durch die Tabelle.
     
    gurbelunder gefällt das.
  4. gurbelunder

    gurbelunder Datenbank-Guru

    An Case hab ich garnicht mehr gedacht. Danke dir, auf jeden Fall hübscher!

    Die Ausgabe soll ja in eine Textdatei weitergeleitet werden, die per Mail gesendet wird. Daher passt das zusammengefasst schon.
     
  5. gurbelunder

    gurbelunder Datenbank-Guru

    Ich habe jetzt das Skript soweit bearbeitet und zwei Cases eingefügt. Um hier auch Klarheit zu schaffen:

    Ich selber frage die Tabelle 'dba_scheduler_job_run_details' unter Oracle ab. Diese protokolliert die Jobs, die gelaufen sind. Ich generiere darauf einen wöchentlichen oder monatlichen Bericht als Zusammenfassung.

    dba_scheduler_job_run_details ist eine Systemtabelle, hier sind die Werte SUCCEEDED für Daumen hoch oder andere für Daumen runter vermerkt. Sie wird natürlich nicht von mir geändert.

    Einen boolschen Wert hätte ich auch besser gefunden.

    Auf jeden Fall, hier meine Abfrage als Ergebnis der Diskussion:

    Code:
    SELECT SUM(CASE WHEN STATUS='SUCCEEDED' THEN 1 ELSE 0 END) AS ERFOLGREICH, SUM(CASE WHEN STATUS NOT LIKE 'SUCCEEDED' THEN 1 ELSE 0 END) AS FEHLERHAFT FROM dba_scheduler_job_run_details WHERE job_name LIKE '%BACKUP%';
    
    Achso: in dem speziellen Fall hier betrachte ich nur Jobs, die im namen das Kürzel BACKUP tragen, daher die WHERE Klausel. Ich habe eigentlich auch nur Backupjobs laufen, die von mir selber erstellt worden sind und in die Tabelle eingetragen werden.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden