SQL-Anweisung

25/09/2007 - 10:26 von Michael Bayer | Report spam
Hallo zusammen,

ich brüte wieder über einer SQL-Abfrage und brauch wohl die
Unterstützung der Koryphàen hier.

Ausgangsbasis sind zwei Tabellen. Die eine, "Wohnungen" beinhaltet
beschreibende Daten zu Wohnungen.

Die zweite Tabelle "Mieter" beinhaltet die Mieter der Wohnungen. Einer
Wohnung können dabei beliebig viele Mieter zugeordnet sein. Die
entsprechenden Schlüsselfelder sind bereits eingerichtet.

Jedem Mieter ist unter anderem sein Mietvertragsdatum (= Mietbeginn) und
- falls vorhanden - das Kündigungsdatum (= Mietende) hinterlegt:

Beispiel:

Tabelle "Wohnungen"

ID Bezeichnung

1 Wohnung 1
2 Wohnung 2
3 Wohnung 3

Tabelle "Mieter"

Wohnung Name Mietvertrag Kündigungsdatum
1 Mieter A 01.01.1995 31.08.1999
1 Mieter B 01.01.2000 30.04.2003
1 Mieter C 01.09.2004 31.12.2006

2 Mieter D 01.10.2000 31.05.2005


Gefordert sind die Zeitràume, in denen die Wohnungen leerstanden. Diese
ergeben sich aus den zeitlichen Abstànden zwischen Kündigungsdatum und
dem darauffolgenden Mietvertragsdatum. Ein Leerstand ist auch dann
gegeben, wenn einer Wohnung noch nie ein Mieter hinterlegt wurde.

Aus o.a. Tabelle ergeben sich also folgende Leerstànde:

Wohnung 1

01.09.1999 bis 31.12.1999
01.04.2004 bis 31.08.2004
01.01.2007 bis ? (steht also seit dem 01.01.2007 leer)

Wohnung 2

01.06.2005 bis ? (steht also seit dem 01.06.2005 leer)

Wohnung 3

ist dauerhaft leerstehend, da ihr noch nie ein Mieter hinterlegt wurde.


Die Kündigungsdaten und Mietvertragsdaten werden als "LeerstandVon" und
"LeerstandBis"-Felder benötigt. Die Ergebnistabelle mit o.a. Daten
sollte also folgendermaßen aussehen:

ID Wohnung LeerstandVon LeerstandBis
1 1 01.09.1999 31.12.1999
2 1 01.04.2004 31.08.2004
3 1 01.01.2007
4 2 01.06.2005
5 3


Zwar hab ich eine Lösung gefunden, aber die liest alle Wohnungen in
einen Cursor ein und ermittelt die Leerstànde für jede Wohnung einzeln -
und das dauert natürlich ewig.

Die ideale Lösung wàre, wenn die Abfrage so aufgebaut wàre, daß sie die
Daten in der Art "alle Leerstànde am 01.07.2007" liefert - wobei in
diesem Fall die Datensàtze mit der ID 3, 4 und 5 zurückgegeben werden
würden.

Ich hoffe, ich konnte mich verstàndlich ausdrücken und hoffe auf Eure Hilfe.

Vielen Dank und viele Grüße
Michael
 

Lesen sie die antworten

#1 Christoph Muthmann
26/09/2007 - 16:23 | Warnen spam
Michael Bayer wrote:
Hallo zusammen,

ich brüte wieder über einer SQL-Abfrage und brauch wohl die
Unterstützung der Koryphàen hier.

Ausgangsbasis sind zwei Tabellen. [snip]



Hallo Michael,
so sollte es gehen:

Set Nocount on
create table #wohnung(Wohnung int, Name char(10))
insert into #wohnung(Wohnung, Name) Values (1, 'Wohnung 1')
insert into #wohnung(Wohnung, Name) Values (2, 'Wohnung 2')
insert into #wohnung(Wohnung, Name) Values (3, 'Wohnung 3')

create table #mieter(Wohnung int, Name char(10), Mietvertrag datetime,
Kuendigungsdatum datetime)

insert into #mieter(Wohnung, Name, Mietvertrag, Kuendigungsdatum)
values (1, 'Mieter A', '1995-01-01', '1999-08-31')
insert into #mieter(Wohnung, Name, Mietvertrag, Kuendigungsdatum)
values (1, 'Mieter B', '2000-01-01', '2003-04-30')
insert into #mieter(Wohnung, Name, Mietvertrag, Kuendigungsdatum)
values (1, 'Mieter C', '2004-09-01', '2006-12-31')
insert into #mieter(Wohnung, Name, Mietvertrag, Kuendigungsdatum)
values (2, 'Mieter D', '2000-10-01', '2005-05-31')

select *
from #mieter

select *
from #wohnung

select a.wohnung, b.kuendigungsdatum + 1 as Leerstand_von,
a.mietvertrag - 1 as Leerstand_bis
from #mieter a, #mieter b
where a.wohnung = b.wohnung
and a.Mietvertrag >= b.Kuendigungsdatum
and b.Kuendigungsdatum in (select max(Kuendigungsdatum) from #mieter c
where c.Wohnung = b.Wohnung and c.Mietvertrag < a.Mietvertrag)
union
select a.wohnung, a.kuendigungsdatum + 1 as Leerstand_von, NULL as
Leerstand_bis
from #mieter a
where not exists (select 1 from #mieter b where a.wohnung = b.wohnung
and b.Mietvertrag >= a.Kuendigungsdatum)
union
select a.wohnung, Null as Leerstand_von, NULL as Leerstand_bis
from #wohnung a left outer join #mieter b on a.wohnung = b.wohnung
where b.wohnung is null
order by Wohnung, Leerstand_von
go
drop table #mieter
drop table #wohnung


Einen schönen Tag noch,
Christoph
(Please post ALL replies to the newsgroup only unless indicated
otherwise)

Ähnliche fragen