Count(*)=0 ?

Hallo allerseits,

ich stecke gerade in einer Situation, die ich folgendermassen beschreiben möchte:
Angenommen, ich habe eine Tabelle mit Parametern (die in dieser Tabelle mehrfach auftreten) und zugehörigen Messwerten.
Die Anzahl der Messwerte pro Parameter kann ich ja relativ einfach mit
„select parameter, count(*) from tabelle group by parameter“
abfragen.
Ergibt meinetwegen:

parameter count(*)

ParA 125
ParB 125
ParC 125
ParD 125

4 rows selected.

Nun stehe ich vor dem Problem, dass ich die Messwerte pro Parameter haben will, die größer als eine bestimmte Schranke sind.
Mit der Anweisung
„select parameter, count(*) from tabelle where messw>limlow group by parameter“
werden nun jedoch die Parameter, die keine Messwerte haben, die der Forderung entsprechen, einfach ausgeblendet, also z.B.:

parameter count(*)

ParA 123
ParB 125
ParD 88

3 rows selected.

Mich würde interessieren, ob jemand von euch weiß, wie ich ein Ergebnis von der Form:

parameter count(*)

ParA 123
ParB 125
ParC 0
ParD 88

4 rows selected.

hinbekomme, ohne nachträglich dann noch viele Klimmzüge machen zu müssen.

Beste Grüsse

Michael Zadlo

hallo

folgender script sollte (kann ihn gerade nicht testen) zumindest auf oracle funktionieren

select t1.parameter, nvl(t2.anzahl,0)
from tabelle t1, (select parameter, count(*) anzahl from tabelle
where messw > limlow
group by parameter) t2
where t1.parameter = t2.parameter(+)

christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

„select parameter, count(*) from tabelle where messw>limlow
group by parameter“
werden nun jedoch die Parameter, die keine Messwerte haben,
die der Forderung entsprechen, einfach ausgeblendet, also
z.B.:

parameter count(*)

ParA 123
ParB 125
ParD 88

3 rows selected.

Mich würde interessieren, ob jemand von euch weiß, wie ich ein
Ergebnis von der Form:

parameter count(*)

ParA 123
ParB 125
ParC 0
ParD 88

4 rows selected.

hinbekomme, ohne nachträglich dann noch viele Klimmzüge machen
zu müssen.

habe gerade kein oracle zur verfügung, aber dort müsste es so gehen:

select parameter, sum(decode(sign(messwert-limit),-1,0,1)))
from tabelle
group by parameter ;

messwert - limit liefert negative zahlen, wenn der messwert unter dem limit liegt. mit sign(value) bekommt man -1 wenn value negativ ist, 0 wenn value 0 ist und 1 wenn value positiv ist. über das decode werden alle negativen werte auf 0 und alle positiven werte auf 1 umgesetzt. nun einfach die summe darüber bilden und schon hast du dein gewünschtes ergebnis.

das obige verfahren ist übrigens auch ein ganz guter trick, um in pivot-tabellen bei excel zwischenergebnisse zu berechnen, die normalerweise nicht gehen.

bei anderen datenbanken weiss ich nicht genau, was die für funktionen anbieten. eine art sign-funktion wird es auf jeden fall geben. das decode heisst vielleicht if oder sonstwie.

wenn’s kein decode oder was ähnliches gibt, gehts natürlich auch so:

sum(sign(sign(messwert-limit)+1))

auch damit zählt man nur jene werte, die gleich oder über dem limit liegen.

erwin