Wie Ergebnis 'erzwingen'?

Hallo zusammen?
Ich arbeite mit einer Oracle 9i- Datenbank. Nun habe ich eine Tabelle xy.

Dazu habe ich eine Abfrage, die kein Ergebnis liefert, also nicht NULL, sondern eben eine leere Ergebniszeile->nichts.
Nun möchte ich aber ein Ergebnis „erzwingen“. Da gab es doch auch einen Befehl für, oder??

Meine Abfrage sieht so aus:

select
 stationbez
 ,count(id) Anzahl\_xy
 from
 Tabelle\_xy
 where
 Typus= 'Irgendwas'
 and
 datum1\> :vDatum

Nun soll aber auf jeden Fall eine stationbez (1, 2, 3 oder 4) ausgegeben werden.

Kann mir jemand helfen??

Gruß
Florian

Hallo Florian,

select
stationbez
,count(id) Anzahl_xy
from
Tabelle_xy
where
Typus= ‚Irgendwas‘
and
datum1> :vDatum

group by stationbez;

oder meinst du das ersetzen von NULL-Werten ?
dann
select
nvl(stationbez, 1)
.
.
.

Grüße

Chris

Hallo Chris,
das mit dem group by ist zwar richtig, aber nicht die Lösung des Problems…

Ich möchte ja auf jeden Fall eine ergebniszeile, auch wenn es theoretisch keine gibt.

ALso habe ich an not exists gedacht. Aber irgendwie komme ich nicht weiter.
Mein Code:

select
1 stationbez
,0 Anzahl_Stillstände
from dual
where not exists
(select
stationbez
,count(id) Anzahl_Stillstände
from
Tabelle_xy
where
stationbez= 1
and
datum1> :vDatum
)

Das liefert mir für den Fall, daß es keine Egebniszeile der Station1 gibt, das Ergebnis von dual. Wenn es aber ein Ergebnis gäbe, kommt nichts.
Dann soll aber das eigentliche Ergebnis kommen.
Ich hoffe, ich konnte mich jetzt verständlicher ausdrücken.

Gruß
Florian

Hallo,

so geht es:

select distinct stationbez, 
(SELECT count(\*) FROM Tabelle\_xy WHERE datum \> '01.01.2007') Anzahl\_xy
 from Tabelle\_xy
 where Typus= 'Irgendwas'
 order by stationbez;

Hier tauchen alle Stationen auf, die vom Typus ‚Irgendwas‘ sind. Wenn Du die auch haben willst, muss das auch noch in den inneren Select.

Gruß

Peter

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

Leider nein…
Hallo,
Deine Antwort mag zwar richtig sein und dafür auch erstmal vielen Dank, aber es ist nicht des Rätsels Lösung.
Ich habe mich auch etwas dämlich ausgedrückt.
Problem:
Hole die Werte aus Tabelle xy, wo das datum größer :vDatum ist. Gibt es keinen Datensatz, dann gebe aus, was ich Dir vorgebe (select from dual).
Also habe ich an das gedacht:

select 
 1 stationbez
 ,0 Anzahl\_Stillstände
from dual
where not exists
(select
 stationbez
 ,count(id) Anzahl\_Stillstände
 from
 Tabelle\_xy
 where
 Stationbez= 1
 and
 datum1\> :vDatum
)

Das liefert mir für den Fall, daß es keine Egebniszeile der Station1 gibt, das Ergebnis von dual. Wenn es aber ein Ergebnis gäbe, kommt nichts.
Dann soll aber das eigentliche Ergebnis kommen.
Ich hoffe, ich konnte mich jetzt verständlicher ausdrücken.

Gruß
Florian

Hallo,

nein, deutlich war das nicht.

Was ist mit Station 2, 3 und 4, wenn da nichts steht?
Warum immer Station 1?
Anzahl Stillstände?

Versuch doch einfach mal das Problemzu beschreiben und nicht die Abfrage.

Gruß

Peter

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

hi Florian

zwei lösungen fallen mir ein:

die data-warehouse-funktionen sollten eine syntax kennen, bei der pseusozeilen angegeben werden können, die bei jedem select IMMER geliefert werden, egal was das statement sonst noch liefert. kenne mich mit diesen funktionen aber nicht so aus und bin mir auch nicht sicher, ob das ganze nicht erst ab oracle 10g funktioniert.

es gibt aber eine lösung, die auf jeden fall funktioniert, setzt aber etwas voraus:

  • in deiner tabelle muss jede station mind. einmal vorkommen
  • die datenmenge darf nicht zu gross sein, da meine lösung wirklich SAULANGSAM ist (fulltablescan auf die gesammte tabelle!!)

hier meine lösung:

select stationbez,
 sum(
 decode(
 decode(typus,'Irgendwas',1,0)
 + decode(sign(datum1 - :vDatum),1,1,0)
 ,2,1
 ,0
 )
 ) Anzahl\_xy
 from Tabelle\_xy
 group by stationbez
;

schaut sehr kompliziert aus und ist es bis zu einem gewissen grad auch:

das erste decode liefert 1, wenn der typus „Irgendwas“ ist und 0, wenn der typus was anderes ist.

das zweite decode liefert 1, wenn datum1 grösser als vDatum ist und 0, wenn es kleiner-gleich ist.

sign liefert 1, wenn der parameter positiv ist, 0, wenn der parameter 0 ist, und -1, wenn der parameter negativ ist.

das dritte decode liefert 1, wenn die beiden inneren decodes jeweils 1 liefern (also die summe der decodes 2 ist), und 0, wenn dies nicht der fall ist.

mit dem sum summiere ich einfach das ergebnis des äusseren decodes.

eine zusätzliche where-klausel ist nur dann anzuraten, wenn:

  • die tabelle wirklich sehr gross ist
  • und in der restmenge jede station mind. einmal vorkommt (egal welcher typus, datum1 etc.)

die selbe technik kann an anwenden, wenn man eine art kreuztabelle mit standard-sql-mitteln erhalten will. ist zwar kompliziert und wartungsintensiv, erspart einem aber in manchen fällen einen zu hohen „tooleinsatz“.

lg
erwin

Hallo Peter,

Hallo,

nein, deutlich war das nicht.

Was ist mit Station 2, 3 und 4, wenn da nichts steht?
Warum immer Station 1?
Anzahl Stillstände?

Versuch doch einfach mal das Problemzu beschreiben und nicht
die Abfrage.

okay, danke schon mal für die Geduld.
Also, es geht um folgendes:
wenn es einen „Zwischenfall“ gibt, steht eine der Anlagen 1 - 4.
Dies kann ja täglich möglich sein.
Nun möchte ich anzeigen lassen, ob es an Tag x, meinetwegen der 01.01.2006 einen Stillstand an Anlage 1 gab.
Dazu würde ich gerne den Tag als Parameter (:VDatum)auswählen.
So, nun soll er die Anzahl der Stillstände des Tages :vDatum anzeigen. Gab es keine Störung, soll er mir die Anlagennummer trotzdem ausgeben und eben die Anzahl der Störungen, die ich dann ja selbst mit 0 angebe (select 0 from dual).
Das Ganze würde ich wohl mit einem union all für jede Anlage machen, oder? Also quasi 4 Abfragen in einer…
Danke nochmals und Gruß
Florian

Hallo Florian,

meinst du so etwas?
Environment:

SQL\*Plus: Release 8.0.6.0.0 - Production on Fr Apr 28 12:16:52 2006
(c) Copyright 1999 Oracle Corporation. All rights reserved.
Verbunden mit: 
Oracle8i Enterprise Edition Release 8.1.7.4.0 - Production
With the Partitioning option
JServer Release 8.1.7.4.0 - Production

Zunächst meine Tabelle mit den Werten:

SQL\> select \* from werte order by 1,2;

STATIONBEZ ID
---------- ----------
 2 A
 3 A
 3 B
 4 A
 4 B
 4 C

6 Zeilen ausgewählt.

Dann das Statement:

select stationbez, max(Anzahl\_Stillstaende) from
((select w.stationbez stationbez,count(w.id) Anzahl\_Stillstaende from werte w group by w.stationbez)
union
(select rownum,0 from all\_objects where rownum 
<u>Und nun die Ausgabe:</u>


    STATIONBEZ MAX(ANZAHL\_STILLSTAENDE)
    ---------- ------------------------
     1 0
     2 1
     3 2
     4 3



Wenn auch ich dich falsch verstanden habe, entschuldige.

Falls du noch Fragen hast, immer heraus...

Grüßt: Guido

Hallo Florian,

aber das ist doch genau das, was du mit meinem Select bekommst.
Alle Anlagen und die Anzahl der Störungen darauf. (0 wenn es keine Störung gegeben hat)

Gruß

Peter

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

Hallo florian
Ich hatte auch schon mal ein ähnliches problem.
Bei mir wars etwa so:
Select a.nrprd00, a.nrpar00
From prod.tabel a, prod.tabel b
where a.nrpar00 = b.nrpar00
and not exists (select *
from prod.tabel c
where a.nrpar00 = c.nrpar00
and c.nrprd00 = 1000)
for fetch only:
Ich bekam immer etwa 5 - 10 einträge pro nrpar00 und nrprd00.
Dann habe ich die tabellen genauer angesehen und gemerkt, dass ein hystory eintrag gemacht wurde, der aktuelle war der mit einem nrvrn00 = 9999 (nummer version history 9999 = aktuell 1 = erste history usw. und dem sarec00 = ‚2‘, die histori hatte immer den eintrag ‚7‘, und gelöscht den eintrag 9999 und 2
Also so:
nrpar00 nrpd00 nrvrn00 sarec00
300000 1000 9999 2 = aktuell
300000 1000 0001 2 = history
300000 1000 0002 2 = history
300000 1000 0003 2 = history
300000 1000 0004 2 = history
300000 1000 0005 2 = history
ein saldierter eintrag war so abgelent:
300000 1000 9999 7 = aktuell
300000 1000 0001 2 = history
300000 1000 0002 2 = history
300000 1000 0003 2 = history
300000 1000 0004 2 = history
300000 1000 0005 2 = history

also war meine lösung so:
Select a.nrprd00, a.nrpar00
From prod.tabel a, prod.tabel b
where a.nrpar00 = b.nrpar00
and a.nrvrn00 = 9999
and a.sarec00 = ‚2‘
and not exists (select *
from prod.tabel c
where a.nrpar00 = c.nrpar00
and c.nrprd00 = 1000
and c.nrvrn00 = 9999
and c.sarec00 = ‚2‘)

Ich hoffe ich konnte dir helfen,
gruss and

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