Dilbert: SQL-Problem: Artikel mit Gewicht der höchsten Auflage

Hallo zusammen,

nachdem ich das Forumsarchiv erfolglos durchsucht habe stelle ich jetzt doch einen Beitrag ein. Zugegeben, es kann gut sein, dass es schon eine Lösung im Archiv gibt, wenn ja, konnte ich diese aber nicht meinem Problem zuordnen (Transferleistung).

Also nun zu meinem Problem. Ich habe eine Tabelle, die in etwa so aussieht:

ARTIKELNUMMER     AUFLAGENNUMMER     GEWICHT
-------------     --------------     -------
00001             01                 365
00001             02                 365
00001             03                 589
00001             04                 401
00035             01                 255
00034             01                 100
00034             02                 098
...

Jeder Artikel hat also eine oder mehrere Auflagen, die unterschiedliche Gewichte haben können.

Mein Ziel: Eine Tabelle, in der immer nur die Artikelnummern und das Gewicht der Aktuellen (MAX) Auflage aufgeführt sind.

Mit der folgenden Abfrage bekomme ich zwar jeweils den Artikel und die aktuellste Auflage aber nicht das Gewicht.

SELECT artikelnummer, MAX(auflagennummer)
FROM artikel
GROUP BY artikelnummer

Ich muss zugeben, dass ich auch eher selten mit komplizierteren SQL-Abfragen arbeite und deswegen nicht gut in Übung mit Unterabfragen und so bin.

Fällt jemand von euch eine Lösung ein?

Vielen Dank schon einmal - auch für Hinweise auf bestimmte Archivartikel!

Viele Grüße

Dilbert

  1. Halihallo Dilbert

    [...]
    Welches DBMS? - Bitte bei Anfragen zu Datenbanken immer die verwendete DBMS + Version
    angeben, denn diese Information ist für die Lösung stets relevant.

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Halihallo Dilbert

      Hi Philipp

      [...]
      Welches DBMS?

      Oracle, Version 8.1.7.4.0

      Bitte bei Anfragen zu Datenbanken immer die verwendete DBMS + Version
      angeben, denn diese Information ist für die Lösung stets relevant.

      Ok, bei weiteren Fragen (die bestimmt kommen ;o)) werd ich mich bessern!

      Viele Grüsse

      Philipp

      Gruß,

      Dilbert

      1. Hi,

        ich war leider zu bloed es mit 'group by' und 'having' und "Sub-Selects" machen.

        Hier etwas SQL-Code von MS, der getestet laeuft. Ggf. anpassen fuer Oracle.

        ----------
        begin
        -- Wir nehmen also einen Cursor
        declare
         SELFHTML_CURSOR cursor for
          (
          select
           ARTIKELNUMMER, max(AUFLAGENNUMMER)
          from
           SELFHTML_TABLE
          group by
           ARTIKELNUMMER
          )
        -- "Arbeitsvariablen"
        declare
         @ARTIKELNUMMER  int,
         @AUFLAGENNUMMER_MAX int,
         @GEWICHT  int
        -- Cursor oeffnen
        open
         SELFHTML_CURSOR
        -- "anlesen"
        fetch next from
         SELFHTML_CURSOR
        into
         @ARTIKELNUMMER,
         @AUFLAGENNUMMER_MAX
        -- Abbruchbedingung erfuellt, wenn entsprechende Statusmeldung vom Datenserver kommt
        while (@@fetch_status = 0)
         begin
         set
          @GEWICHT =
           (
           select
            GEWICHT
           from
            SELFHTML_TABLE
           where
            (ARTIKELNUMMER = @ARTIKELNUMMER)  and
            (AUFLAGENNUMMER = @AUFLAGENNUMMER_MAX)
           )
         -- AUSGABE
         print
          @GEWICHT
         -- "weiterlesen"
         fetch next from
          SELFHTML_CURSOR
         into
          @ARTIKELNUMMER,
          @AUFLAGENNUMMER_MAX
         end
        -- aufraeumen
        close
         SELFHTML_CURSOR
        deallocate
         SELFHTML_CURSOR
        end
        ----------

        Gruss,
        Lude

  2. Halihallo Dilbert

    ARTIKELNUMMER     AUFLAGENNUMMER     GEWICHT
    -------------     --------------     -------
    00001             01                 365
    00001             02                 365
    00001             03                 589
    00001             04                 401
    00035             01                 255
    00034             01                 100
    00034             02                 098
    ...
    Mein Ziel: Eine Tabelle, in der immer nur die Artikelnummern und das Gewicht der Aktuellen (MAX) Auflage aufgeführt sind.

    SELECT
          a.artikelnummer,
          MAX(a.gewicht)
       FROM
          tabelle a
       WHERE
          a.auflagennummer >= ALL (
             SELECT MAX(b.auflagennummer)
                FROM
                   tabelle b
                WHERE
                   b.artikelnummer=a.artikelnummer
          )
       GROUP BY
          a.artikelnummer

    so in _etwa_ (wahrscheinlich ist der Query noch voller Fehler). Er dient lediglich
    dem Verständnis, ich kenne mich mit Oracle nicht gut aus.

    Was ist der PRIMARY KEY? - (artikelnummer,auflagennummer)?

    Viele Grüsse

    Philipp

    --
    RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
    Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
    1. Hi,

      so in _etwa_ (wahrscheinlich ist der Query noch voller Fehler).

      erfolgreich getestet unter 'MS SQL Server 2000'.   *Aerger*

      Gruss,
      Lude

      1. Halihallo Lude

        so in _etwa_ (wahrscheinlich ist der Query noch voller Fehler).
        erfolgreich getestet unter 'MS SQL Server 2000'.   *Aerger*

        TIMTOWTDI, Lude :-)
        Es führen mehrere Wege nach Rom...

        Viele Grüsse

        Philipp

        --
        RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
        Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
        1. Hi,

          so in _etwa_ (wahrscheinlich ist der Query noch voller Fehler).
          erfolgreich getestet unter 'MS SQL Server 2000'.   *Aerger*

          TIMTOWTDI, Lude :-)
          Es führen mehrere Wege nach Rom...

          habe mich selbst vielleicht dreissig Minuten bemueht und dann kommt der Operator 'all' und weist ueberzeugend den Weg.   *aerger*

          Hast Du noch mehr solche Sachen im Repertoire?   ;-)

          Gruss,
          Lude

    2. Hi Philipp,

      vielen Dank! Die Abfrage funktioniert!!!!

      Herzliche Grüße

      Dilbert

  3. Hallo Dilbert,

    wie wärs denn damit:
    SELECT artikelnummer, auflagennummer,gewicht
    FROM artikel
    WHERE auflagennummer IN(SELECT max(auflagenummer) FROM artikel)

    Grüße Oesi