Susann: SQL Abfrage

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

  1. 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 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

    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

    1. 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

      1. 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

        1. 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

          1. 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

    2. Hello,

      DB ist SQL-Server.
      Meinst Du MySQL-Server?

      Warum sollte sie?

      MfG
      Rouven

      --
      -------------------
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
      There's no such thing as a free lunch  --  Milton Friedman
      1. 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

  2. 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

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet
    1. 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

  3. 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

    1. 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

      1. 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?

    2. Vielen lieben Dank!!!!!!!!!!