Komplexe Fallunterscheidungen in Query

Hallo zusammen,

ich habe eine recht komplexe Abfrage zu machen und weiß nicht wie ich das am besten machen kann.

Also:

Ich habe eine Tabelle, wo Vertragsdaten von Personen drinstehen. Jede Person kann beliebig viele Verträge haben.
Je Vertrag gibt es ein Beginndatum, ein Endedatum, und zusätzlich noch je ein Korrekturfeld für das Beginn- und Endedatum, das aber nicht in jedem Fall gefüllt ist.

Z.B.:

pn | beginn | ende | beginn_korr | ende_korr

1 | 01.02.2000 | 31.07.2003 | NULL | NULL
1 | 01.08.2003 | 15.01.2004 | NULL | 31.01.2004

Ich brauche jetzt für jede Person die Summe ihrer Vertragszeiten, also prinzipiell:

SELECT SUM(DATEDIFF(day, beginn, ende)), pn
FROM tabelle
GROUP by pn

Das Problem sind jetzt aber die „Sonderfälle“:

  1. Wenn ein Korrekturfeld gefüllt ist, ist dieses zu verwenden (also „beginn_korr“ statt „beginn“, bzw. „ende_korr“ statt „ende“)

  2. Liegt das Vertragsende in der Zukunft und zwar nach dem nächsten Schulhalbjahresbeginn (1.2. / 1.8.), dann ist der Schulhalbjahresbeginn als Endedatum zu nehmen.

Der „nächste“ Schulhalbjahresbeginn ist vom aktuellen Datum aus zu sehen. Z.Zt. ist es der 1.2.08, ab Februar 2008 ist es dann der 1.8.08, usw.

***

Habt ihr das verstanden?
Wie kann ich diese Query formulieren?

Danke im Voraus für eure Hilfe!

piranja

Hallo Piranja,

  1. habe ich nicht ganz verstanden, aber für 1. gibt es ifnull()
    http://dev.mysql.com/doc/refman/5.1/de/control-flow-…

Gruß, Andreas

Hallo Andreas,

  1. habe ich nicht ganz verstanden, aber für 1. gibt es
    ifnull()
    http://dev.mysql.com/doc/refman/5.1/de/control-flow-…

Datenbank ist übrigens MS SQL Server 2005, hatte ich vergessen zu schreiben.

Aber egal, ISNULL() hilft mir schonmal ein Stück weiter, vielen Dank.

Zu 2):

Es gibt die beiden Fälle:
a) das Vertragsende ist größer als der nächste „Halbjahresstichtag“(*)
-> dann summiere die Zeitspanne von Vertragsbeginn bis zum Halbjahresstichtag
b) das Vertragsende ist gleich/kleiner als der nächste „Halbjahresstichtag“(*)
-> dann summiere die Zeitspanne von Vertragsbeginn bis zum Vertragsende

(*) „Halbjahresstichtag“ ist entweder der 1. Februar oder der 1. August, je nachdem, welches Datum vom Ausführungsdatum der Query aus gesehen das nächste ist. Von heute (4.10.2007) aus gesehen also der 1.2.2008.

Datenbank ist übrigens MS SQL Server 2005, hatte ich vergessen
zu schreiben.

-> dann muß ich leider passen :smile: