SQL Abfrage
Susann
- datenbank
0 Bademeister0 Bademeister0 Bademeister0 Susann
0 Rouven
0 Rouven0 Susann
0 Vinzenz Mai0 Ilja0 Susann
0 Danke
Susann
Hallo,
ich möchte den Kunden herausfinden, der die meisten Einkäufe hat.
select max (Winner.Anzahl)
from (select count(kundennr) as Anzahl, kundennr, kundenname, Ort
from dbo.Vorgang, dbo.kunde
where Vorgang.kundenid = kunde.kundennr
group by kundennr, kundenname, Ort) as Winner
Das funktioniert und gibt mir die Anzahl der Einkäufe des Kunden mit der größten Menge aus.
Jetzt möchte ich "nur" noch den Kundennamen hinzufügen und das schaffe ich nicht. Füge ich in der esten Zeile
select max (Winner.Anzahl), kundennr
....
hinzu, erhalte ich den Fehler, dass Winner.kundennr ungültig ist?!
DB ist SQL-Server.
Grüße
Hi Susann,
select max (Winner.Anzahl)
from (select count(kundennr) as Anzahl, kundennr, kundenname, Ort
from dbo.Vorgang, dbo.kunde
where Vorgang.kundenid = kunde.kundennr
group by kundennr, kundenname, Ort) as WinnerDas funktioniert und gibt mir die Anzahl der Einkäufe des Kunden mit der größten Menge aus.
Jetzt möchte ich "nur" noch den Kundennamen hinzufügen und das schaffe ich nicht. Füge ich in der esten Zeile
Das, was Du willst, ist im Grunde etwas voellig anderes, als das, was Du tust. Du willst eine bestimmte Zeile der Tabelle Winner, naemlich die mit dem maximalen Wert in Anzahl. Bei Deiner Abfrage gruppierst Du (automatisch durch das Anwenden von max(...) ohne explizite Gruppierung) aber ueber alle Zeilen und das, was Du kriegst, ist nicht der Inhalt einer besimmten Zeile der Tabelle Winner. Daher kannst Du auch nicht einen bestimmten Eintrag von Kundennummer kriegen.
Was Du moechtest ist in etwa:
SELECT Anzahl, kundennr FROM [Tabelle WINNER]
WHERE Anzahl = [das Maximum ueber alle Anzahl-Eintraege in Winner]
Wie Du die Inhalte der eckigen Klammern hinbekommst, weisst Du ja bereits.
Ausserdem:
1. Deine Spalten- und Tabellennamen sind recht unuebersichtlich gewaehlt: mal gross-, mal kleingeschrieben. Das wuerde ich ueberdenken.
2.
DB ist SQL-Server.
Meinst Du MySQL-Server?
Viele Gruesse
der Bademeister
Kleine Anmerkung noch:
SELECT Anzahl, kundennr FROM [Tabelle WINNER]
WHERE Anzahl = [das Maximum ueber alle Anzahl-Eintraege in Winner]
Die abgeleitete Tabelle Winner brauchst Du natuerlich nur in der WHERE-Klausel, in FROM kannst Du auch Deine urspruenglichen Tabellen verwenden - da gibt es keinen Grund, zu gruppieren.
Viele Gruesse,
der Bademeister
Die abgeleitete Tabelle Winner brauchst Du natuerlich nur in der WHERE-Klausel, in FROM kannst Du auch Deine urspruenglichen Tabellen verwenden - da gibt es keinen Grund, zu gruppieren.
Großer Gott, was hab ich denn da für einen Nonsens geschrieben? Bitte glaub mir kein Wort, ich hab nur wieder meine Pillen nicht genommen... ;-)
viele Grüße,
der Bademeister
Großer Gott, was hab ich denn da für einen Nonsens geschrieben? Bitte glaub mir kein Wort, ich hab nur wieder meine Pillen nicht genommen... ;-)
viele Grüße,
der Bademeister
Schon o.k. :-) So lange Du sie NICHT genommen hast.
Winner ist übrigens keine Tabelle sondern ein Subselect.
Grüße
Schon o.k. :-) So lange Du sie NICHT genommen hast.
Winner ist übrigens keine Tabelle sondern ein Subselect.
Nein. Winner ist eine (abgeleitete) Tabelle - das Ergebnis einer Unterabfrage (eines Subselect). Du sollst mir doch nicht gleich alles nicht glauben, was ich geschrieben habe ;-)
Viele Gruesse,
der Bademeister
Hello,
DB ist SQL-Server.
Meinst Du MySQL-Server?
MfG
Rouven
DB ist SQL-Server.
Meinst Du MySQL-Server?
Warum sollte sie?
Ah so, DEN SQL-Server ;-) Das hab ich nicht gecheckt, SQL-Server kam mir so nichtssagend vor...
Danke, Gruß
der Bademeister
Hello,
hinzu, erhalte ich den Fehler, dass Winner.kundennr ungültig ist?!
ich habe es gerade mal umgeschrieben und (mit meinen Tabellen) auf einem SQLServer 2000 getestet. Insbesondere bin ich zur expliziten JOIN-Syntax übergegangen. Mein SQLServer hat sich bei einem äußeren SELECT daran gestört, dass MAX eine Aggregatsfunktion ist, kundennr aber nicht, daher:
SELECT MAX(Winner.Anzahl), Winner.kundennr
FROM (
SELECT COUNT(kundennr) AS Anzahl, kundennr, kundenname, Ort
FROM dbo.Vorgang INNER JOIN dbo.kunde ON Vorgang.kundenid = kunde.kundennr
GROUP BY kundennr, kundenname, Ort
) AS Winner
GROUP BY Winner.kundennr
Klappt das bei dir?
MfG
Rouven
Hi,
jein, das klappt zwar, ist aber nicht ganz, was ich will, denn ich erhalte alle Kunden.
Meine Abfrage gibt mir nur einen Wert zurück, nämlich die größte Anzahl Vorgänge. Jetzt möchte ich dazu den Kunden ausgeben. Eine Zeile also nur.
Grüße
Hallo Susann,
ich möchte den Kunden herausfinden, der die meisten Einkäufe hat.
select max (Winner.Anzahl)
from (select count(kundennr) as Anzahl, kundennr, kundenname, Ort
from dbo.Vorgang, dbo.kunde
where Vorgang.kundenid = kunde.kundennr
group by kundennr, kundenname, Ort) as Winner
Das funktioniert und gibt mir die Anzahl der Einkäufe des Kunden mit der größten Menge aus.
Jetzt möchte ich "nur" noch den Kundennamen hinzufügen und das schaffe ich nicht.
dann benötigst Du eine korrelierte Unterabfrage, siehe z.B. </archiv/2008/1/t165377/#m1078290> oder </archiv/2006/7/t133015/#m861544>
SELECT
Winner.kundenname,
Winner.Anzahl
FROM (
SELECT
COUNT(kundennr) Anzahl,
kundennr,
kundenname,
Ort
FROM -- deinen impliziten schreibe ich in einen
dbo.Vorgang -- expliziten Join um
INNER JOIN
dbo.kunde
ON
dbo.Vorgang.kundenid = dbo.kunde.kundennr
GROUP BY
kundennr,
kundenname,
Ort
) Winner
WHERE
Winner.Anzahl = (
SELECT
MAX(w.Anzahl)
FROM (
SELECT
COUNT(kundennr) Anzahl,
kundennr,
kundenname,
Ort
FROM
dbo.Vorgang
INNER JOIN
dbo.kunde
ON
dbo.Vorgang.kundenid = dbo.kunde.kundennr
GROUP BY
kundennr,
kundenname,
Ort
) w -- wichtig: anderer Aliasname!
)
Durch Deinen temporären View sieht das halt nochmals etwas aufwendiger aus.
Nicht getestet, sollte aber das gewünschte liefern.
Freundliche Grüße
Vinzenz
moin Vinz,
ich würde es ein wenig umschreiben, so das ich in der FROM klausel keine unterabfrage habem aber das ist sicherlich auch geschmackssache:
SELECT hier_kunden_daten
FROM kunde k
WHERE (hier_korrelierte_Unterbafrage_mit_Anzahl_Einkäufe_des_Kunden)
=
(hier_Unterbafrage_mit_MAX_Anzahl_Einkäufe)
Ilja
moin Vinz,
ich würde es ein wenig umschreiben, so das ich in der FROM klausel keine unterabfrage habem aber das ist sicherlich auch geschmackssache:
SELECT hier_kunden_daten
FROM kunde k
WHERE (hier_korrelierte_Unterbafrage_mit_Anzahl_Einkäufe_des_Kunden)
=
(hier_Unterbafrage_mit_MAX_Anzahl_Einkäufe)Ilja
Dann fehlt mir aber in der Ausgabe die Anzahl, oder?
Vielen lieben Dank!!!!!!!!!!