Announcement

Collapse
No announcement yet.

Benötige Hilfe bei SQL-Abfrage!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Benötige Hilfe bei SQL-Abfrage!!

    Hallo zusammen,

    ich muss für mein Studium eine SQL-Abfrage schreiben, an der ich mittlerweile am verzweifeln bin!

    Ich versuche mal den Sachverhalt so verständlich wie möglich darzustellen:

    In der Grafik im Anhang kann man sehen, dass es u.a. die Tabellen LAGERBESTAND und TEILE gibt.

    Datenbank_Aufg.18.JPG

    Die Aufgabe lautet lapidar: " In welchem Lager werden die meisten Artikel (Typ = 'Artikel') gelagert? Geben Sie die LANR aus!"

    Klingt einfach, ist aber schwerer, da ja nur die LANR ausgegeben werden soll. Somit fällt eine Gruppenfunktion in der SELECT-Klausel weg. Ich habe schon versucht in der WHERE-Klausel mit MAX(SUM(Lagerbestand.BESTAND) zu schachteln, aber das gibt kein Ergebnis. Auch mit HAVING hatte ich keinen Erfolg.

    Folgend noch meine bisherigen Ansätze:

    1.
    SELECT Lagerbestand.LANR
    FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
    WHERE Teile.TYP = 'Artikel'
    GROUP BY Lagerbestand.LANR
    HAVING SUM(Lagerbestand.BESTAND) > 9000

    --> Das liefert die richtige Trefferzeile aber ist mit > 9000 künstlich eingeschränkt. Die Abfrage muss allgemeingültig sein.


    2.
    SELECT Lagerbestand.LANR, SUM(Lagerbestand.LANR)
    FROM Lagerbestand INNER JOIN Teile ON Lagerbestand.TNR=Teile.TNR
    WHERE Lagerbestand.BESTAND = (SELECT MAX(SUM(Lagerbestand.LANR)) FROM Lagerbestand GROUP BY Lagerbestand.LANR)
    GROUP BY Lagerbestand.LANR

    --> Hier habe ich es mit einer Unterabfrage versucht, komme aber auch nicht weiter.

    Wäre echt toll, wenn jemandem dazu was einfallen würde.

    Wenn noch Infos fehlen, kann ich diese gerne nachreichen.


    Gruß
    Dominik

  • #2
    Hallo Dominik,

    also der Reihe nach:
    Gesucht ist die LANR des größten Lagerbestandes des Teile-Typs 'Artikel'. Also suchen wir zunächst mal diesen Maximalen Lagerbestand:

    [highlight=sql]
    select max(l.BESTAND) MAX_BESTAND
    from TEILE t
    inner join LAGERBESTAND l on l.TNR = t.TNR
    where t.TYP = 'Artikel'
    [/highlight]

    Die LANR eines Lagerbestandes bekommen wir mit:
    [highlight=sql]
    select l.LANR
    from TEILE t
    inner join LAGERBESTAND l on l.TNR = t.TNR
    where t.TYP = 'Artikel'
    [/highlight]

    Jetzt brauchen wir beide Abfragen nur noch zu kombinieren, also den Lagerbestand der gleich dem maximalen Lagerbestand ist:
    [highlight=sql]
    select l.LANR
    from TEILE t
    inner join LAGERBESTAND l on l.TNR = t.TNR
    where t.TYP = 'Artikel'
    and l.BESTAND = (
    select max(l2.BESTAND)
    from TEILE t2
    inner join LAGERBESTAND l2 on l2.TNR = t2.TNR
    where t2.TYP = 'Artikel'
    )
    [/highlight]

    Insofern waren deine Versuche gar nicht so schlecht, allerdings hast du etwas zu kompliziert gedacht . Eine Summenbildung ist nicht notwendig, da es zu jedem Lager + Artikel nur einen Bestand geben kann. (Zusammengesetzter PK).

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hallo Falk,

      vielen lieben Dank für deine schnelle Antwort!

      Deine Lösung hat funktioniert!! Hast mir sehr geholfen!


      Nochmals Danke!

      Gruß
      Dominik

      Comment


      • #4
        Ich muss leider nochmal nachhaken. Mit der Lösung bekomme ich nur den höchsten Einzelbestand für einen Artikel über alle Läger gesehen.

        Aber laut Aufgabenstellung soll ja das Lager mit dem höchsten Gesamtbestand aller Artikel gefunden werden.

        Somit müsste man erstmal die Bestandssumme pro Lager bilden und von den Ergebnissen das höchste Ergebnis wählen.

        Also vereinfacht: MAX(SUM(Bestand_pro_Lager))
        Das knifflige dabei ist die korrekte Syntax.

        Hat vielleicht noch jemand eine Idee?
        Zuletzt editiert von the_nowist; 09.06.2009, 21:56. Reason: was vergessen

        Comment


        • #5
          Hallo Dominik,

          ich hoffe wir reden nicht aneinander vorbei.

          Originally posted by the_nowist View Post
          ...Die Aufgabe lautet lapidar: " In welchem Lager werden die meisten Artikel (Typ = 'Artikel') gelagert? Geben Sie die LANR aus!"
          Diese Aufgabenstellung interpretiere ich so: Gesucht ist das Lager (LANR), in dem das Teil mit TEILE.TYP = 'Artikel' den größten Bestand, also den größten Wert in LAGERBESTAND.BESTAND hat.
          Lt. beigefügtem Tabellenschema besitzt die Tabelle LAGERBESTAND einen zusammengestzten PK aus LANR (Lagernr.) und TNR (Teilenr.). Daraus läßt sich folgern, dass keine Summenbildung notwendig ist, da jede Lager/Teile-Kombination nur einmal vorkommen kann. D.h. Zum Lager A kann es nur einen DS für das Teil 'Artikel' geben.

          Anders würde es aussehen, wenn das Lager mit den meisten Teilen (also unterschiedlichen Typs) gesucht wäre, dann würde es komplizierter und es müßte zusätzlich (wie von dir angedeutet) noch die Summe gebildet werden.
          Lass dich hier nicht von der Begrifflichkeit 'Artikel' verwirren und verwechsle dies nicht mit einem 'Teil'. Wenn dir das Probleme macht, dann ersetz in der Aufgabenstellung einfach mal 'Artikel' durch 'Schrauben'.

          "In welchem Lager werden die meisten Schrauben (Typ = 'Schrauben') gelagert? Geben Sie die LANR aus!"

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk,

            danke für deine Antwort.

            Ich verstehe die Fragestellung anders.

            Hier die komplette Frage:
            In welchem Lager werden die meisten Artikel (Typ = 'Artikel') gelagert? Geben
            Sie die LANR aus! Analysieren Sie einmal mengenmäßig („die größte Menge“)
            und zum anderen nach der Anzahl „unterschiedlicher Artikel“!

            Somit werden zwei Abfragen benötigt:
            1. In welchem Lager ist die Summe aller Artikel am größten?
            2. In welchem Lager ist die Anzahl der unterschiedlichen Artikel am Größten?

            Ich hoffe, so ist es verständlicher.

            Bei 1. müsste man also zuerst die Summe der Bestände ermitteln und davon den höchsten Wert.
            Bei 2. müsste man die unterschiedlichen Artikel pro Lager zählen und davon den höchsten Wert.

            Zum besseren Verständnis habe ich mal den Tabelleninhalt beigefügt:

            Tabelle_Lagerbestand.JPG

            Demnach muss das Erbenis für 1. = Lager 2 sein, da hier die Summe der Artikel am höchsten ist:

            LANR ANZAHL_LAGERBESTAND
            1 5899
            2 9899 --> Ergebnis
            3 7798


            Bei 2. muss dass Ergebnis = Lager 3 sein, da hier die meisten unterschiedkichen Artikel lagern:

            LANR ANZAHL_TEILE
            1 4
            2 5
            3 6 --> Ergebnis

            Hinweis: In der Tabelle "Lagerbestand" befinden sich ausschließlich Artikel, so dass man eigentlich nicht mehr über "Teile" (TYP='Artikel) eingrenzen müsste.

            Hoffe du hast vielleicht noch eine Idee.

            Gruß
            Dominik

            Comment


            • #7
              Hallo Dominik,

              du hast recht! Bisher war ich davon ausgegangen, das der Typ 'Artikel' mit einer eindeutigen TNR einhergeht. Nach nochmaligem ansehen des DB-Schemas ist dies jedoch nicht so. Es kann verschiedene (mit unterschiedlichen TNR) Teile des Typs 'Artikel' geben. Damit ist meine Lösung nicht richtig.

              Das macht das Ganze natürlich etwas komplizierter. Die "korrekten" Artikellagerbestände pro Lager bekommt man mit:
              [highlight=sql]
              select l.LANR, sum(l.BESTAND) SUM_BESTAND
              from TEILE t
              INNER JOIN LAGERBESTAND l on l.TNR = t.TNR
              WHERE t.TYP = 'Artikel'
              GROUP BY l.LANR
              [/highlight]

              Davon brauchen wir jetzt den Größten Wert:
              [highlight=sql]
              select max(BESTANDSUMMEN.SUM_BESTAND) MAX_BESTAND
              from (
              select l2.LANR, sum(l2.BESTAND) SUM_BESTAND
              from TEILE t2
              INNER JOIN LAGERBESTAND l2 on l2.TNR = t2.TNR
              WHERE t2.TYP = 'Artikel'
              GROUP BY l2.LANR
              ) BESTANDSUMMEN
              [/highlight]

              Und zu diesem Max. Bestand müssen wir nun das Lager finden:
              [highlight=sql]
              select l.LANR
              from TEILE t
              INNER JOIN LAGERBESTAND l on l.TNR = t.TNR
              WHERE t.TYP = 'Artikel'
              GROUP BY l.LANR
              having sum(l.BESTAND) = (
              select max(BESTANDSUMMEN.SUM_BESTAND)
              from (
              select l2.LANR, sum(l2.BESTAND) MAX_BESTAND
              from TEILE t2
              INNER JOIN LAGERBESTAND l2 on l2.TNR = t2.TNR
              WHERE t2.TYP = t.TYP
              GROUP BY l2.LANR
              ) BESTANDSUMMEN
              )
              [/highlight]

              Zu 2. hast du richtig erkannt, dass man die unterschiedlichen Artikel zählen muß.
              [highlight=sql]
              select l.LANR, count(distinct l.TNR) ANZ_ARTIKEL
              from TEILE t
              INNER JOIN LAGERBESTAND l on l.TNR = t.TNR
              WHERE t.TYP = 'Artikel'
              GROUP BY l.LANR
              [/highlight]

              Der Rest ist dann Schema-F analog zur ersten Aufgabe.

              Da mir keine Testdaten zur Verfügung stehen ist das "frei Schnauze" und ggfs. noch Verbesserungswürdig .

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk,

                ja, das scheint die Lösung zu sein.

                Ich danke dir vielmals, auch dass du so engagiert am Thema dran geblieben bist.


                Gruß
                Dominik

                Comment

                Working...
                X