Zweimal Count mit einer Anweisung ausgeben

gurbelunder

Datenbank-Guru
Beiträge
136
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
 
Werbung:

gurbelunder

Datenbank-Guru
Beiträge
136
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';
 

akretschmer

Datenbank-Guru
Beiträge
9.028
Hi zusammen,

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


Code:
Erfolgreich | Fehlerhaft
--------------------------
               10 |                 5

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

Datenbank-Guru
Beiträge
136
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.
 
Werbung:

gurbelunder

Datenbank-Guru
Beiträge
136
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.
 
Oben