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