Unterabfrage in Verbindung mit where funktioniert nicht

noah13

Neuer Benutzer
Beiträge
4
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!!
 
Werbung:
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.

6.Ermitteln Sie die Bestellungen mit dem niedrigsten und dem höchsten Gesamtbetrag
und stellen Sie sie in der u.a. Form gegenüber. Die Beträge sind auf zwei
Nachkommastellen zu runden. Das Ergebnis ist wie folgt darzustellen:

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.
 
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
 
AW: Unterabfrage in Verbindung mit where funktioniert nicht

Hallo noah13,

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?

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.


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


Versuch mal...

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

... oder ...

Code:
... WHERE min(LineTotal) = 123

... und schau auf die Fehlermeldungen

Gruß Charly
 
Werbung:
Zurück
Oben