Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Kleine frage zu having,group by...

Frage Entwicklung Datenbanken

Mitglied: alterVerwalter

alterVerwalter (Level 1) - Jetzt verbinden

26.01.2010 um 09:27 Uhr, 3365 Aufrufe, 3 Kommentare

Hallo,

habe folgende tabelle 'einkauf'

artnr lieferant preis
111 A 10
111 B 9
111 C 12
222 A 7
222 C 12

ich will ganz einfach als Ergebnis eine Liste mit allen artikel haben mit dem geringsten einkaufspreis und dem enstprechenden günstigsten preis

Ganz simpel habe ich es versucht mit

01.
select artnr,lieferant,min(preis) from einkauf group by artnr


Aber dann wird nicht der entsprechende Lieferant mit dem günstigsten Preis angezeigt, sondern willkürlich irgendein Lieferant , der diesen Artikel im Programm hat.

Dann habe ich es mit having versucht:

01.
select artnr,lieferant,min(preis) from einkauf group by artnr having min(preis)
Liefert das gleiche Ergebnis wie oben.


Irgendwie stehe ich hier total auf dem Schlauch. Ist doch im Prinzip eine simple Sache, oder? Kann doch fast nicht sein,dass ich mich damit den ganzen Morgen beschäftigen muss
Wäre froh, wenn mir kurz jemand auf die Sprünge helfen könnte.
Mitglied: Biber
26.01.2010 um 10:25 Uhr
Moin alterVerwalter,

eine Ermittlung des kleinsten Preises mit MIN(preis) verbunden mit einem "HAVING Min(preis)" ist nicht zielführend.

Bei GROUP BY-Abfragen werden Aggregatfunktionen wie Min/), Max(), Sum(), Avg()... verwendet, richtig.
Aber: HAVING "filtert" den Resultset einer kumulierten GROUP BY-Abfrage nur auf die Felder, die auch in der Feldliste erwähnt sind.
Und da kannst du den Lieferanten noch nicht dabeihaben.

Versuch es mit einem Subselect.

01.
SELECT einkauf.artnr,einkauf.lieferant, einkauf.preis  
02.
FROM einkauf, (SELECT artnr, min(preis) as minpreis FROM Einkauf GROUP BY artnr) billichKauf 
03.
WHERE einkauf.ARTNR=billichkauf.artnr 
04.
AND einkauf.preis=billichkauf.minpreis

...würde liefern:

artnrlieferantpreis
111B 9
222A7


Grüße
Biber
Bitte warten ..
Mitglied: nxclass
26.01.2010 um 10:56 Uhr
Wird bei GROUP nicht immer der zuerst gefundene Wert genommen ? - dann sollte doch auch:
01.
SELECT tmp.* 
02.
FROM ( 
03.
    SELECT artnr, lieferant, preis 
04.
    FROM einkauf 
05.
    ORDER BY preis 
06.
   /*  WHERE artnr = @artnr */ 
07.
    ) AS tmp 
08.
GROUP BY tmp.lieferant, tmp.artnr
... funktionieren. Mit dem Vorteil das nicht über die 'preis' Spalte gesucht werden muss. (bzw. ein Index generiert werden muss)

btw. Hat die Tabelle keine ID ?

edit: SQL überarbeitet
Bitte warten ..
Mitglied: alterVerwalter
26.01.2010 um 11:48 Uhr
hallo,

danke biber, deine lösung hat genau das gebracht was ich gesucht habe!
Auf den trichter, dass ich den subquery auch in from einbringen kann, bin ich nicht gekommen, hatte es in der where klausel versucht, aber da bin ich nicht weiter gekommen und habe es wieder verworfen.

@nxclass: diese tabelle war natürlich nur sehr sehr stark vereinfacht.
und so ganz versteh ich auch dein lösungsansatz nicht, und vor allem warum "group by tmp.lieferant"?
wenn ich das so verwendete bekomm ich doch nur eine tabelle mit nur einer zeile pro lieferant mit willkürlicher ean und preis?!?

ist das wirklich so "eleganter"?


Aber ich denke mal, dass ich mit Biber´s Lösung auch zum Ziel komme!?!
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Datenbanken
gelöst SSIS - Group By und MAX von String-Spalten (2)

Frage von batpoint zum Thema Datenbanken ...

LAN, WAN, Wireless
gelöst HP Switches - Frage zu Spanning Tree bzw. Loop Back Protection (12)

Frage von chfran zum Thema LAN, WAN, Wireless ...

Hyper-V
Grundsatz Frage Anbindung Hyper V Hosts ans Netzwerk (7)

Frage von Eifeladmin zum Thema Hyper-V ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...