none
Dynamische Case when RRS feed

  • 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

    Montag, 23. Januar 2012 13:15

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

     

    Montag, 23. Januar 2012 14:21
  • 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
    Montag, 23. Januar 2012 14:23

Alle Antworten