Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Count(*) = 0? (https://www.delphipraxis.net/185936-sql-count-%2A-%3D-0-a.html)

Sven M. 20. Jul 2015 10:19

Datenbank: Oracle • Version: 11 • Zugriff über: FireDac

SQL Count(*) = 0?
 
Hi zusammen,
ich habe eine DB, auf deren Struktur ich keinen Einfluss habe - daher entsteht das folgende Problem überhaupt erst. :D

Ich habe eine Tabelle "Objects", in der alle meine Objekte mit einer ID eindeutig identifiziert werden.
Desweiteren gibt es eine Log-Tabelle mit dem Namen log$object_events, in der Statusänderungen aller(!) Objekte erfasst werden.

Nun will ich zu allen meinen Objekten wissen, wie oft ein bestimmtes Event aufgetreten ist.

Code:
select object$ID, count(Event) as DisableCount
from log$object_events
where event = 'OBJECT_DISABLED'
group by OBJECT$ID
Das funktioniert soweit ganz gut, wenn es einen entsprechenden Event-Eintrag für die ObjectID gibt. Nur will ich den Count zu allen(!) Objekt-IDs ausgegeben haben, auch wenn das Event noch nicht aufgetreten ist. Dann soll der Count halt 0 sein.
Google sagte mir, dass es da die Funktion "nvl" gibt. Nach meinem Verständnis müsste die Abfrage folgendermaßen abgeändert werden:

Code:
select object$ID, nvl(count(Event), 0) as DisableCount
from log$object_events
where event = 'OBJECT_DISABLED'
group by object$ID
Aber auch hier bekomme ich nur die Objekte geliefert, bei denen das Event schon aufgetreten ist.

Ich gehe davon aus, dass lediglich mein Brett vor dem Kopf momentan verhindert, dass ich selber drauf komme. Daher bitte ich um Beistand um mich auf den Pfad der Tugend zurückzuführen. :D

DeddyH 20. Jul 2015 10:23

AW: SQL Count(*) = 0?
 
Ein Count(*) müsste nach meiner Kenntnis genügen.

Sven M. 20. Jul 2015 10:28

AW: SQL Count(*) = 0?
 
Count(*) bringt das gleiche Ergebnis wie Count(beliebiger_Spaltenname). ;)

ibp 20. Jul 2015 10:47

AW: SQL Count(*) = 0?
 
mal so aus den Fingern gesaugt...kann sein, dass bei nicht vorhandenem Event das Ergebnis für den count = Null ist.

SQL-Code:
select obj.ID, count(Event) as DisableCount  
from Objects obj
left join log$object_events loe on (loe.object$ID = obj.ID)
where loe.event = 'OBJECT_DISABLED'
group by obj.ID

Sven M. 20. Jul 2015 10:53

AW: SQL Count(*) = 0?
 
Auch das gibt mir nur die Datensätze zurück, in denen das betreffende Event existiert. :(

p80286 20. Jul 2015 10:59

AW: SQL Count(*) = 0?
 
Wie kommst Du auf Die Idee etwas das nicht vorhanden ist zu zählen?
Natürlich kennst Du die Events die auftreten können, aber Deine Tabelle kennt nur die, die bereits aufgetreten sind.
Du bräuchtest ungefär so etwas:
SQL-Code:
select Eventname,Count(*)
from tableEvent join log$object_events on ( log$object_events.eventid=tableevent.eventid)
Group by eventname   ----- pardon vergessen!
Union
select Eventname,0
from tableEvent left join log$object_events on ( log$object_events.eventid=tableevent.eventid)
where log$object_events.eventid is null
Gruß
K-H

Sven M. 20. Jul 2015 11:07

AW: SQL Count(*) = 0?
 
Der Hintergrund ist, dass ich mir alle Objekte ausgeben lassen will, die momentan verfügbar (enabled) sind.
Das kann ich aber nur herausfinden, indem ich prüfe, ob das Objekt einmal mehr aktiviert als deaktiviert wurde.
Sprich: ich brauche die Anzahl der Enabled- und Disabled-Events um mir später dann nur die Objekte ausgeben zu lassen, bei denen EnableCount > DisableCount.

Ich weiß: das ist völlig beschissen designed, weil es eine einfache StatusID auch getan hätte. Aber wie gesagt: die Struktur ist nicht auf meinen Mist gewachsen und ich habe da keinen Einfluss drauf. ;)

Ich schaue mir deinen Vorschlag mal genauer an und gucke, inwieweit ich das auf mein Projekt übertragen kann.


Danke erstmal soweit!
Weitere Inputs natürlich jederzeit willkommen.

rapante 20. Jul 2015 11:07

AW: SQL Count(*) = 0?
 
Ein einfacher Subselect sollte das tun was du möchtest:

Code:
SELECT id,
       (SELECT COUNT(*) FROM log$object_events WHERE (object$ID = object.id) AND (event = 'OBJECT_DISABLED')) AS eventcount
FROM object;

jobo 20. Jul 2015 11:20

AW: SQL Count(*) = 0?
 
Zitat:

Zitat von rapante (Beitrag 1309250)
Ein einfacher Subselect sollte das tun was du möchtest:

Code:
SELECT id,
       (SELECT COUNT(*) FROM log$object_events WHERE (object$ID = object.id) AND (event = 'OBJECT_DISABLED')) AS eventcount
FROM object;

Richtig, wobei ich das Subselect als Outer Join mit in die From Clause ziehen würde. Könnte schneller sein.

Klaus01 20. Jul 2015 11:46

AW: SQL Count(*) = 0?
 
Zitat:

Zitat von Sven M. (Beitrag 1309249)
Der Hintergrund ist, dass ich mir alle Objekte ausgeben lassen will, die momentan verfügbar (enabled) sind.
Das kann ich aber nur herausfinden, indem ich prüfe, ob das Objekt einmal mehr aktiviert als deaktiviert wurde.
Sprich: ich brauche die Anzahl der Enabled- und Disabled-Events um mir später dann nur die Objekte ausgeben zu lassen, bei denen EnableCount > DisableCount.

.. ein Zeitstempel, wann ein Objekt enabled/disabled wurde, ist in der Tabelle nicht vorhanden?

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz