holger12: group by probleme

hi!!

eine tabelle artikel hat die spalten kategorie_nr, artikelname, einzelpreis. nun soll der von jeder  kategorie der teuerste artikel mit namen , kategorienummer und Einzelpreis ausgegeben werden. das muss ich ja irgendwie mit group by machen, oder??
sowas habe ich schon versucht: select kategorie_nr, max(einzelpreis) from artikel group by kategorie_nr. das funktioniert auch aber , wie baue ich da aber noch das artikelname ein?
irgendwie ergeben meine versuche dazu nur blödsinn??!!

ach und Noch was: kann man groub by immer nur zusammen mit funktionen wie count(), sum(), etc. verwenden???

thx!

  1. Hallo holger12,

    eine sehr wichtige Information hast Du uns leider vorenthalten:
    Dein Datenbankmanagement und seine Version.

    sowas habe ich schon versucht: select kategorie_nr, max(einzelpreis) from artikel group by kategorie_nr. das funktioniert auch aber , wie baue ich da aber noch das artikelname ein?

    Bis jetzt ist das richtig und fängt mit dem Artikelnamen an, etwas komplizierter zu werden. Die einfache Lösung dazu heißt: Mach es mit einem Subselect. Das Dumme an dieser Antwort ist: Ein bei Webhostern verbreitetes Datenbankmanagementsystem, sprich MySQL, unterstützt erst ab einer relativ neuen Version Subselects.

    Zwei Archivthreads, die dieses Thema behandeln:
      http://forum.de.selfhtml.org/archiv/2005/6/t108952/#m679884
      http://forum.de.selfhtml.org/archiv/2005/5/t108614/#m676691

    Relevante Abschnitte in der MySQL-Doku
      http://dev.mysql.com/doc/mysql/en/subqueries.html
      http://dev.mysql.com/doc/mysql/en/example-maximum-column-group-row.html

    ach und Noch was: kann man groub by immer nur zusammen mit funktionen wie count(), sum(), etc. verwenden???

    Für die meisten DBMS heißt die Antwort bedingungslos ja. MySQL läßt leider auch anderes zu, siehe z.B. http://forum.de.selfhtml.org/archiv/2005/6/t109121/#m681195.

    Freundliche Grüße

    Vinzenz

    1. hallo!

      Hallo holger12,

      eine sehr wichtige Information hast Du uns leider vorenthalten:
      Dein Datenbankmanagement und seine Version.

      ich habe ein postgres-system und arbeite mit phppgadmin. version weiß ich nicht - wie kriege ich die denn raus? irgendwas mit 7.X - kann das sein??

      Danke acuh für die Links - aber ich bin da nicht so der profi :-((( d.h. ich blick, da nicht so durch.

      geht das mit einem subselect unter postgres und gäbe es auch eine andere möglichkeit?

      1. Hallo holger12

        ich habe ein postgres-system und arbeite mit phppgadmin. version weiß ich nicht - wie kriege ich die denn raus? irgendwas mit 7.X - kann das sein??

        Hab' ich noch nie benutzt, sollte ich mir vielleicht doch mal installieren.

        Danke acuh für die Links - aber ich bin da nicht so der profi :-((( d.h. ich blick, da nicht so durch.

        Iljas Lösungsvorschlag für Matthias Problem sollte auf Deine Aufgabenstellung anpassbar sein.

        geht das mit einem subselect unter postgres und gäbe es auch eine andere möglichkeit?

        Laut Handbuch der Version 7.2 unterstützt PostgreSQL Subselects. Ich habe ehrlich gesagt auch nichts anderes erwartet.

        Freundliche Grüße

        Vinzenz

        1. hey vinzenz!

          Iljas Lösungsvorschlag für Matthias Problem sollte auf Deine Aufgabenstellung anpassbar sein.

          ja, das ging jetzt:
          select a.artikelname, a.kategorie_nr, einzelpreis from artikel as a where einzelpreis = (select max(einzelpreis) from artikel as a1 where a.kategorie_nr = a1.kategorie_nr);

          es gibt demnach also keine möglichkeit, das alleine über group by zu lösen, oder?

          1. Hallo Holger,

            Iljas Lösungsvorschlag für Matthias Problem sollte auf Deine Aufgabenstellung anpassbar sein.

            ja, das ging jetzt:
            select a.artikelname, a.kategorie_nr, einzelpreis from artikel as a where einzelpreis = (select max(einzelpreis) from artikel as a1 where a.kategorie_nr = a1.kategorie_nr);

            Das ist doch was. Du siehst, dass für Deine Frage im Archiv des Forums bereits eine Antwort vorhanden war (bestimmt nicht die einzige, aber die, an die ich mich erinnern konnte). Ähnliches gilt für viele weitere Fragen. Füttere die Forumssuche mit geeigneten Suchbegriffen und Du wirst in vielen Fällen Lösungswege aufgezeigt bekommen.

            es gibt demnach also keine möglichkeit, das alleine über group by zu lösen, oder?

            Wie ich Dir bereits in meinem ersten Posting verlinkte, geht dies nicht. Du kannst ja nicht nach dem Artikelnamen gruppieren, da Du nicht alle willst, sondern nur einen. Dieser ist exakt bestimmt: es ist der Name des Artikels mit dem höchsten Preis in seiner Kategorie.

            Du willst doch genau das haben, was das SQL-Statement besagt:

            Gib mir
              Artikelname,
              Kategorie,
              Preis
            aus der Artikeltabelle
            wobei ich nur den Artikel mit dem höchsten Preis in seiner Kategorie haben möchte.

            Soo kompliziert ist das Statement auch wieder nicht, ein netter Einstieg in Subselects.

            Freundliche Grüße

            Vinzenz

          2. yo,

            es gibt demnach also keine möglichkeit, das alleine über group by zu lösen, oder?

            nein, über GROUP BY bekommst du das mit den gewünschten spalten nicht hin. GROUP BY ist eine sehr nützliche funktion, die aber auch immer wieder schwierigkeiten im umgang damit macht und zwar meistens dann, wenn man mehr spalten mit ins boot nehmen will als es die gruppierung zulassen würde. dann geht es in aller regel über unterabfragen. aber das ist nun kein beinbruch, sondern das resultat zählt. unter unterabfragen sind beweiten auch nicht so schlimm, wie ihr ruf....

            Ilja

          3. Moin!

            ja, das ging jetzt:
            select a.artikelname, a.kategorie_nr, einzelpreis from artikel as a where einzelpreis = (select max(einzelpreis) from artikel as a1 where a.kategorie_nr = a1.kategorie_nr);

            Denk dran, dass das Ergebnis auch mehr als einen Artikel ergeben kann, sofern es zwei oder mehr Artikel mit dem gleichen, teuersten, Preis gibt.

            es gibt demnach also keine möglichkeit, das alleine über group by zu lösen, oder?

            Ausgeschlossen. MySQL erlaubt es zwar, neben den mit Aggregatfunktionen (COUNT, SUM, MAX,...) versehenen und den im GROUP BY aufgeführten Spalten noch weitere Spalten auszugeben, fordert aber dabei ausdrücklich, dass die einzelnen Ergebniszeilen identischen Inhalt haben müssen, da andernfalls eine zufällige Zeile ausgesucht wird. MySQL begründet dieses Feature mit Performance (man muß diese Spalte nicht nochmal extra ins GROUP BY packen, und die Datenbank muß es folglich auch nicht extra gruppieren), jede andere Datenbank wird an dieser Stelle aber einen Fehler melden.

            • Sven Rautenberg