1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Unterabfrage in Verbindung mit where funktioniert nicht

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von noah13, 19 Januar 2011.

  1. noah13

    noah13 Neuer Benutzer

    Hallo,
    ich bin Anfänger und probiere mich gerade an der AdventureWorksLT. Hab diese Aufgaben überwiegend gelöst aber bei der letzten (Aufgabe 6) weiss ich nicht weiter.
    http://wi.f4.htw-berlin.de/users/morcinek/dbtutor/index.php/Sql%DCbung/AdventureWorksLT

    Möchte mir die MIN/MAX-Werte in einer Unterabfrage in Verbindung mit einer where-Klausel anzeigen. Bekomme auch keine Fehlermeldung. Dennoch erscheinen die gesamten Spaltenwerte.

    Hat vielleicht jemand eine Idee? Wie kann ich ausserdem die Spalte "Bestellungen" in mein Select statement einfügen.

    Hier meine query:

    select
    [SalesOrderID] as BestellID,
    SUM (CAST(LineTotal as numeric (38,2))) as GesamtBetrag
    from [SalesLT].[SalesOrderDetail]
    where 'GesamtBetrag' = (Select (MIN ('Gesamtbetrag')))
    group by [SalesOrderID]

    Vielen Dank!!
     
  2. Charly

    Charly Datenbank-Guru

    AW: Unterabfrage in Verbindung mit where funktioniert nicht

    Hallo noah13

    hast du deine Unterabfrage mal alleine ausgeführt?

    Code:
     
    Select (MIN ('Gesamtbetrag'))
    
    Ergebnis = 'Gesamtbetrag'

    Also ist dein Vergleich
    Code:
     
    WHERE 'Gesamtbetrag' = 'Gesamtbetrag' 
    
    für jede Zeile richtig und du bekommst alle Zeilen zurückgeliefert.

    Wenn du Spalten oder deren Aliase angibst darfst du sie nicht in Hochkommata stellen. Text in Hochkommata wird als Zeichenfolgen und nicht als Spaltenname interpretiert.

    Mein erster Lösungsweg sieht so aus:

    Code:
    SELECT
     CASE 
     WHEN SUM(LineTotal)=(SELECT TOP 1 SUM(LineTotal)
      FROM SalesLT.SalesOrderDetail
      GROUP BY SalesOrderID
      ORDER BY SUM(LineTotal)) THEN '... mit geringstem Betrag:'
     ELSE '... mit höchsten Betrag:' 
     END AS Bestellung
    , SalesOrderID AS BestellID
    , CAST(SUM(LineTotal) AS decimal(10,2)) AS GesamtBetrag
    FROM SalesLT.SalesOrderDetail
    GROUP BY SalesOrderID
    HAVING SUM(LineTotal)=(
     SELECT TOP 1 SUM(LineTotal)
     FROM SalesLT.SalesOrderDetail
     GROUP BY SalesOrderID
     ORDER BY sum(LineTotal)
    )
    OR SUM(LineTotal)=(
     SELECT TOP 1 SUM(LineTotal)
     FROM SalesLT.SalesOrderDetail
     GROUP BY SalesOrderID
     ORDER BY SUM(LineTotal)DESC
    )
    Es könnte, wenn man sich noch ein bisschen damit beschäftigt, auch eleganter gehen aber es erzeugt das gewünschte Ergebnis. Die schreiben ja nicht das es schön aussehen soll.:D

    Gruß Charly

    PS: Ich habe die Adventure Works nicht installiert. Kann also mit den Spaltennamen etwas Haken.
     
  3. noah13

    noah13 Neuer Benutzer

    AW: Unterabfrage in Verbindung mit where funktioniert nicht

    hi charly,
    grosse kino! hab mich mit deiner herangehensweise auseinandergesetzt.

    mir erschliesst sich noch nicht ganz wie du dem system zu verstehen gibst, dass es den max-wert der zelle (A;1) '...mit höchsten betrag' bzw. vice versa den min-wert der zelle (A;2) '...mit geringstem betrag' zuordnet?

    könnte man zudem anstelle der top-klausel auch mit hilfe der max/min aggregatfunktionen arbeiten, um das gewünschte ergebnis zu bekommen?

    vielen dank sagt
    noah13
     
  4. Charly

    Charly Datenbank-Guru

    AW: Unterabfrage in Verbindung mit where funktioniert nicht

    Hallo noah13,

    Dieses SELECT gibt mir die Bestellung mit der kleinsten Gesamtsumme zurück

    Code:
     
    SELECT TOP 1 
       SUM (LineTotal)
    ,  SalesOrderID
    FROM SalesLT.SalesOrderDetail
    GROUP BY SalesOrderID
    ORDER BY SUM(LineTotal)
    
    Wenn ich das Ergebnis des SELECT jetzt als vergleichsoperator im CASE benutze
    Code:
     
    ...
    CASE
    WHEN SUM(LineTotal) = (mein SELECT von oben) THEN '... mit geringstem Betrag:'
    ELSE '... mit höchsten Betrag:' 
    END AS Bestellung
    ...
    
    kann ich bei einem positiven Vergleich der Spalte Bestellung für diese Zeile den Wert '... mit geringstem Betrag:' zuweisen
    Da ich nur 2 Spalten in der Ergebnismenge habe gibts noch ein ELSE für den höchsten Betrag.



    Versuch mal...

    Code:
     
     SELECT min(sum(LineTotal)) FROM ...
    
    ... oder ...

    Code:
     
    ... WHERE min(LineTotal) = 123
    
    ... und schau auf die Fehlermeldungen

    Gruß Charly
     
  5. noah13

    noah13 Neuer Benutzer

    AW: Unterabfrage in Verbindung mit where funktioniert nicht

    danke für deine hilfe charly. hab wieder was dazugelernt!! =;o)
     
Die Seite wird geladen...

Diese Seite empfehlen