Benutzer mit den meisten Antworten
Dynamische Case when

Frage
-
Hallo,
ich habe eine Abfrage die Ungefähr so lautet:
SELECT CASE WHEN DATEDIFF(DAY,geburtsdatum,GETDATE())<20 THEN 'jung' ELSE CASE WHEN DATEDIFF(DAY,geburtsdatum, GETDATE())<30 THEN 'mittel' ELSE CASE WHEN DATEDIFF(DAY,geburtsdatum, GETDATE())<40 THEN 'alt' ELSE 'uralt' END END END FROM kunden
jetzt möchte ich aber das die Definition wann jung, mittel, alt, uralt dynamisch ist und evtl. sogar noch stufen rein oder rauskommen.Mein Gedanke war jetzt ich mach eine Funktion die die Definition aus einer 2 Tabelle liest und dann den richtigen Wert zurück gibt.
Bin mir aber nicht sicher ob das die optimale Lösung ist.
Was meint ihr?
Vielen Dank
Gruss
Reiner
Antworten
-
Hi,
die Idee mit der zweiten Tabelle ist gut. Allerdings dann ohne CASE Abfrage. Du kannst dann direkt mit der Tabelle Joinen, so dass du die Werte aus der zweiten Tabelle direkt abfragst:
CREATE TABLE kundenalter ( mindestwert int, maxiwert int, bezeichnung varchar(50) ) INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (0,20, 'jung') INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (20,40, 'alt') INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (40,100, 'uralt') SELECT kunden.name, etc... kundenalter.bezeichnung FROM kunden inner join kundenalter on DATEDIFF(DAY,geburtsdatum,GETDATE()) >= kundenalter.mindestwert and DATEDIFF(DAY,geburtsdatum,GETDATE()) < kundenalter.maxiwert
Grüße
Oliver
- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 16:58
-
use tempdb go declare @Altersstufe as table ( Stufengrenze int, Name nvarchar(55) ) insert into @Altersstufe values (20,'jung'),(30,'mittel'), (40,'alt'),(200,'uralt') declare @Kunde as table ( Name nvarchar(55), GeburtsDatum datetime, [Alter] as datediff(year,GeburtsDatum,getdate()) ) insert into @Kunde values ('K1','2000'),('K2','1990'),('K3','1980'),('K4','1922') select k.*, a.Name Stufengrenze from @Kunde k inner join @Altersstufe a on k.[Alter] < a.Stufengrenze and a.Stufengrenze = (select min(Stufengrenze) from @Altersstufe aa where aa.Stufengrenze > k.[Alter])
ExPEditor - free SQL Server database documentation tool- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 16:58
Alle Antworten
-
Hi,
die Idee mit der zweiten Tabelle ist gut. Allerdings dann ohne CASE Abfrage. Du kannst dann direkt mit der Tabelle Joinen, so dass du die Werte aus der zweiten Tabelle direkt abfragst:
CREATE TABLE kundenalter ( mindestwert int, maxiwert int, bezeichnung varchar(50) ) INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (0,20, 'jung') INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (20,40, 'alt') INSERT INTO kundenalter (mindestwert, maxiwert, bezeichnung) VALUES (40,100, 'uralt') SELECT kunden.name, etc... kundenalter.bezeichnung FROM kunden inner join kundenalter on DATEDIFF(DAY,geburtsdatum,GETDATE()) >= kundenalter.mindestwert and DATEDIFF(DAY,geburtsdatum,GETDATE()) < kundenalter.maxiwert
Grüße
Oliver
- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 16:58
-
use tempdb go declare @Altersstufe as table ( Stufengrenze int, Name nvarchar(55) ) insert into @Altersstufe values (20,'jung'),(30,'mittel'), (40,'alt'),(200,'uralt') declare @Kunde as table ( Name nvarchar(55), GeburtsDatum datetime, [Alter] as datediff(year,GeburtsDatum,getdate()) ) insert into @Kunde values ('K1','2000'),('K2','1990'),('K3','1980'),('K4','1922') select k.*, a.Name Stufengrenze from @Kunde k inner join @Altersstufe a on k.[Alter] < a.Stufengrenze and a.Stufengrenze = (select min(Stufengrenze) from @Altersstufe aa where aa.Stufengrenze > k.[Alter])
ExPEditor - free SQL Server database documentation tool- Als Antwort markiert Robert BreitenhoferModerator Montag, 13. Februar 2012 16:58
-
Hallo seffer,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
Robert
Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.