none
SQL-Abfrage Zuordnung RRS feed

  • Frage

  • Hallo,

    mir fehlt ein Ansatzpunkt...

    Ich habe eine Tabelle ZUORDNUNG:

    KATEGORIE   KAT_WERT
    A                   100
    B                   500
    C                   2000
    ...

    Ich möchte durch eine Abfrage (mit einem Wert) eine Zuordnung des Wertes zur entsprechenden Kategorie erhalten.

    WERT   KATEGORIE

    650   ->   C
    30     ->   A
    200   ->   B

    Bsp.  SELECT KATEGORIE from ZUORDNUNG WHERE max(KAT_WERT) <= 650

    Wie könnte man so etwas lösen?

    Donnerstag, 29. Dezember 2011 10:30

Antworten

  • Mit einem SubSelect lässt es sich lösen.

    Zuerst den maximalen KAT_WERT der kleiner gleich dem vorgegebenen Wert ist ermitteln und dann mit einer Relation auf die gleiche Tabelle die Kategorie abfragen.

    SELECT k.KATEGORIE

    FROM (SELECT max(KAT_WERT) as LP FROM ZUORDNUNG WHERE KAT_WERT <= 650) as kp

    left join ZUORDNUNG k on kp.LP = k.KAT_WERT

    Fred

    • Bearbeitet perlfred Donnerstag, 29. Dezember 2011 11:27 Rechtschreibung
    • Als Antwort markiert perlfred Donnerstag, 29. Dezember 2011 11:27
    Donnerstag, 29. Dezember 2011 11:26
  • Du hasst im Grunde folgende Möglichkeiten:

    DECLARE @Kategorie TABLE ( KATEGORIE CHAR(1) ,    KAT_WERT INT );
    
    INSERT INTO @Kategorie VALUES
            ( 'A' , 100 ) ,
            ( 'B' , 500 ) ,
            ( 'C' , 2000 ) ;
    
    DECLARE @Wert TABLE ( Wert INT ) ;
    
    INSERT INTO @Wert VALUES
            ( 650 ) ,
            ( 30 ) ,
            ( 200 ) ;
    
    SELECT *
    FROM     @Wert W
                 OUTER APPLY ( SELECT TOP ( 1 ) KATEGORIE
                                             FROM     @Kategorie
                                             WHERE KAT_WERT > W.Wert
                                             ORDER BY KAT_WERT ASC ) K ( Kategorie ) ;
    
    SELECT * ,
                 ( SELECT TOP ( 1 ) KATEGORIE
                     FROM     @Kategorie
                     WHERE KAT_WERT > W.Wert
                     ORDER BY KAT_WERT ASC ) AS Kategorie
    FROM     @Wert W ;
    
    SELECT * ,
                 ( SELECT MIN(KATEGORIE)
                     FROM     @Kategorie
                     WHERE KAT_WERT > W.Wert ) AS Kategorie
    FROM     @Wert W ;
    
    SELECT W.Wert,
                 MIN(K.KATEGORIE)
    FROM     @Wert W
                 INNER JOIN @Kategorie K ON K.KAT_WERT > W.Wert
    GROUP BY W.Wert; 

    Die dritte Abfrage den besten Abfrageplan hat. Und die letzte Abfrage funktioniert nur, wenn die Kategoriebezeichnung selbst gleich sortierbar ist, wie der assoziierte Wert.

    • Als Antwort markiert perlfred Donnerstag, 29. Dezember 2011 13:57
    Donnerstag, 29. Dezember 2011 12:48
    Moderator

Alle Antworten

  • Mit einem SubSelect lässt es sich lösen.

    Zuerst den maximalen KAT_WERT der kleiner gleich dem vorgegebenen Wert ist ermitteln und dann mit einer Relation auf die gleiche Tabelle die Kategorie abfragen.

    SELECT k.KATEGORIE

    FROM (SELECT max(KAT_WERT) as LP FROM ZUORDNUNG WHERE KAT_WERT <= 650) as kp

    left join ZUORDNUNG k on kp.LP = k.KAT_WERT

    Fred

    • Bearbeitet perlfred Donnerstag, 29. Dezember 2011 11:27 Rechtschreibung
    • Als Antwort markiert perlfred Donnerstag, 29. Dezember 2011 11:27
    Donnerstag, 29. Dezember 2011 11:26
  • Du hasst im Grunde folgende Möglichkeiten:

    DECLARE @Kategorie TABLE ( KATEGORIE CHAR(1) ,    KAT_WERT INT );
    
    INSERT INTO @Kategorie VALUES
            ( 'A' , 100 ) ,
            ( 'B' , 500 ) ,
            ( 'C' , 2000 ) ;
    
    DECLARE @Wert TABLE ( Wert INT ) ;
    
    INSERT INTO @Wert VALUES
            ( 650 ) ,
            ( 30 ) ,
            ( 200 ) ;
    
    SELECT *
    FROM     @Wert W
                 OUTER APPLY ( SELECT TOP ( 1 ) KATEGORIE
                                             FROM     @Kategorie
                                             WHERE KAT_WERT > W.Wert
                                             ORDER BY KAT_WERT ASC ) K ( Kategorie ) ;
    
    SELECT * ,
                 ( SELECT TOP ( 1 ) KATEGORIE
                     FROM     @Kategorie
                     WHERE KAT_WERT > W.Wert
                     ORDER BY KAT_WERT ASC ) AS Kategorie
    FROM     @Wert W ;
    
    SELECT * ,
                 ( SELECT MIN(KATEGORIE)
                     FROM     @Kategorie
                     WHERE KAT_WERT > W.Wert ) AS Kategorie
    FROM     @Wert W ;
    
    SELECT W.Wert,
                 MIN(K.KATEGORIE)
    FROM     @Wert W
                 INNER JOIN @Kategorie K ON K.KAT_WERT > W.Wert
    GROUP BY W.Wert; 

    Die dritte Abfrage den besten Abfrageplan hat. Und die letzte Abfrage funktioniert nur, wenn die Kategoriebezeichnung selbst gleich sortierbar ist, wie der assoziierte Wert.

    • Als Antwort markiert perlfred Donnerstag, 29. Dezember 2011 13:57
    Donnerstag, 29. Dezember 2011 12:48
    Moderator
  • Hallo Stefan!

    Soooo viele Lösungen. Muss ich mir mal in Ruhe ansehen.

    Danke!!

    Fred.

    Donnerstag, 29. Dezember 2011 13:57