Kniffliges SQL-Statement

Arndtinho

Erfahrenes Mitglied
Hallo,

ich habe hier ein kniffliges SQL-Statement und bin fast am verzweifeln.
Eine Tabelle hat folgende Struktur:
Code:
user_refid  |  duration_time  |  valid_from
   1        |      15         |		
   2        |      18         |
   3        |      18         |
   2        |      20         | 20080701
Aus dieser Tabelle sollen für jeden User die Zeiten ermittelt
werden. Zu beachten ist, wenn 'valid_from' gefüllt ist, muss
geprüft werden, ob das angegebene Datum größer oder gleich
dem aktuellen Tagesdatum ist. Wenn es so ist, dann muss die
dazugehörige Zeit zurückgeliefert werden, wenn nicht dann die
alte (ohne 'valid_from') Zeit.
Hat von Euch jemand eine Idee, wie man das lösen kann?

Es handelt sich hierbei um einen MS SQL Server.

Viele Grüße
Arndtinho
 
Hallo Arndtinho,

wenn ich dich richtig verstanden habe, dann gibt es zu jeder user_refid einen zeitlich gültigen Datensatz. D.h. es wird nicht summiert bzw. gruppiert.

Dann geht es so:
Code:
SELECT     user_refid, duration_time, valid_from
FROM         Tabelle1
WHERE     (valid_from IS NULL) AND (NOT (user_refid IN
                          (SELECT     user_refid
                            FROM          Tabelle1
                            WHERE      (valid_from > GETDATE()))))
UNION
SELECT     user_refid, duration_time, valid_from
FROM         Tabelle1
WHERE     (valid_from > GETDATE())
Code:
user_refid    duration_time    valid_from
1                 15    
2                 20             01.07.2008
3                 18
 
Hallo,

sorry erstmal, dass ich mich erst jetzt wieder melde.
Also, das Ergebnis sollte so aussehen:

User 1 - 15
User 2 - 18
User 3 - 18

Ab dem 01.07.2008:

User 1 - 15
User 2 - 20
User 3 - 18

Ich denke auch, dass ich diese Geschichte über ein UNION SELECT lösen muss. Ist Zwar bei großen Datenmengen nicht gerade performant aber nicht anders lösbar.

Viele Grüße
Arndtinho
 
Hallo Arndtinho,

beim SQL brauchst du nur die Bedingung beim GETDATE() ändern, dann bekommst du die gewünschten Ergebnisse.
Bei meinem ersten Post hatte ich das <= nur in > geändert, um beide Ergebnisse (vor und nach dem 01.07.2008) zu testen.

Code:
SELECT     user_refid, duration_time, valid_from
FROM         Tabelle1
WHERE     (valid_from IS NULL) AND (NOT (user_refid IN
                          (SELECT     user_refid
                            FROM          Tabelle1
                            WHERE      (valid_from <= GETDATE()))))
UNION
SELECT     user_refid, duration_time, valid_from
FROM         Tabelle1
WHERE     (valid_from <= GETDATE())
Code:
user_refid    duration_time
1                 15
2                 18
3                 18
 
Zurück