x-plosiv: Frage zu ORDER BY

Hallo zusammen

Folgendes Problem. Ich möchte aus einer Datenbank Produkte ausgeben.

produkt
datum
lager

Nun möchte ich die Produkte folgendermassen Ausgeben.

Zuerst sollen alle Produkte angezeigt werden welche mind. einen Lagerbestand von 1 haben. Diese sollen aber nach dem Datum sortiert werden unabhängig vom Lagerbestand (bzw. der Lagerbestand muss mind. 1 betragen, die Sortierung unter diesen Produkten soll aber nach dem Datum geschehen). Anschliessend sollen alle Produkte ausgegeben werden, welche einen Lagerbestand haben von 0 und diese auch wieder nach dem Datum sortiert.

Ich hoffe ihr versteht was ich meine. Irgendwie stehe ich zur Zeit auf dem Schlauch und komme nicht auf die Lösung. Ich hoffe ihr könnt mir helfen.

Besten Dank im voraus.

Andy

  1. Hallo,

    erstmal sollen alle Bestände kommen. Für ORDER müssen die also einen kleinen Wert bekommen, danach alle Lager-Leichen, die müssen einen größeren Wert erhalten.

    SELECT
    ...
    ,ISNULL(lager)        AS sort
    ...
    ORDER BY sort, datum

    Wenn lager einen Wert hat, ist sort FALSE und kommt bei ORDER zuerst.

    Jetzt musst du nur noch den Fall klären, wenn der Bestand 0 (Ziffer 0) ist.

    Lieben Gruß, Kalle

    1. Hallo Kalle

      Vielen Dank für deinen Tip. Hab's zwar noch nicht ganz hinbekommen, denke aber ich bin auf dem richtigen Weg.

      Jetzt ist mir aber eine weitere Problematik eingefallen. Und zwar können die Lagerbestände auch Minus-Bestände haben. Also nicht nur 0. Die ISNULL() Abfrage nimmt wohl dann auch die Minusbstände oder? Wie kann ich das umgehen?

      1. Hi,

        Und zwar können die Lagerbestände auch Minus-Bestände haben.

        Müssen da dann erst n Stück davon ins Lager gelegt werden, damit das Lager leer ist?

        Die ISNULL() Abfrage nimmt wohl dann auch die Minusbstände oder? Wie kann ich das umgehen?

        Dann sortiere halt nicht nach ISNULL, sondern nach xxx > 0

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      2. Hi!

        Jetzt ist mir aber eine weitere Problematik eingefallen. Und zwar können die Lagerbestände auch Minus-Bestände haben. Also nicht nur 0. Die ISNULL() Abfrage nimmt wohl dann auch die Minusbstände oder? Wie kann ich das umgehen?

        ISNULL() ist vermutlich das falsche Werkzeug, denn es wertet den Spezialwert NULL und nicht die Zahl 0 aus. NULL nimmt man im Allgemeinen für eine Angabe die nicht bekannt oder nicht vorhanden ist. Bei 0 weißt du, dass du keinen Lagerbestand hast, bei NULL musst du deinen Lagerverwalter nachschauen lassen, ob etwas und wieviel da ist. Ich nehme an, dass deine Spalte mit NOT NULL deklariert ist, dann kann sie sowieso keine NULL-Werte aufnehmen, denn das Auswerten und Pflegen von NULL über eine Programmoberfläche ist mit etwas Aufwand verbunden, so dass du den Unterschied zwischen NULL und 0 hättest kennen müssen.

        Um das Ergebnis eines Vergleiches in eine sortierbare Form zu bringen, gibt es Konstrukte wie CASE oder die Funktion IF().

        ORDER BY IF(x > 0, 1, IF(x = 0, 2, 3)

        Lo!

        1. Hallo Lo

          Sorry, ich bekomme es nicht hin. Kannst mir vielleicht nochmals helfen. Danke

          ORDER BY IF(lager >= 1,datum desc, IF(products_quantity <= 0,datum desc,3)

          das ganze müste doch in etwa so aussehen oder? das klappt nur leider überhaupt nicht :-(. irgendwie stehe ich noch auf dem schlauch.

          1. was soll ich denn bei der 2 FALSE (3) ausgeben?
          2. müsste das ganze nicht zuerst noch irgendwie gruppiert werden?

          1. Hi,

            ORDER BY IF(lager >= 1,datum desc, IF(products_quantity <= 0,datum desc,3)

            das ganze müste doch in etwa so aussehen oder?

            Wenn du dieser Auffassung bist, dann erkläre uns bitte, was dieser Code deiner Meinung nach bewirken soll.

            Und erkläre uns bitte auch, welche Bedeutung die beiden Spalten lager und products_quantity haben - bisher war nur von einem Lagerbestand die Rede.

            das klappt nur leider überhaupt nicht :-(

            "Funzt nich" ist keine brauchbare Problembeschreibung.
            </hilfe/charta.htm#tipps-fuer-fragende>

            1. was soll ich denn bei der 2 FALSE (3) ausgeben?

            Kannst du deine Fragen bitte so formulieren, dass sie verständlich sind?

            Du willst doch in beiden Fällen nach dem Datum absteigend gruppieren - nur nicht als erstes, sondern erst als zweites Sortierkriterium.
            Und wie man das erste Sortierkriterium herstellen kann, dazu hast du schon einen Tipp bekommen.

            1. müsste das ganze nicht zuerst noch irgendwie gruppiert werden?

            Was soll eine Sortierung mit einer Gruppierung zu tun haben?

            MfG ChrisB

            --
            “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
          2. Hi!

            Sorry, ich bekomme es nicht hin. Kannst mir vielleicht nochmals helfen. Danke

            Ich sprach davon, das Vergleichsergebnis in eine sortierbare Form zu bringen. Das war zwar korrekt, aber offensichtlich zu knapp formuliert, da du auch nicht mein Beispiel nicht verstanden hast.

            Momentan hast du nur drei Bedingungen

            lager > 0
            lager = 0
            lager < 0

            Du brauchst aber Werte wie Zahlen, die sich gegeneinander vergleichen lassen

            1 < 2 < 3

            Du musst also aus dem Vergleich zu einem dieser Zahlenwerte kommen. Wenn du dir jetzt noch einmal mein Beispiel und die Arbeitsweise von IF() anschaust, solltest du zu dem Ergebnis kommen, dass das in Pseudo-Code folgendes macht:

            wenn lager > 0
              return 1
            ansonsten
              wenn lager = 0
                return 2
              ansonsten // wenn lager < 0
                return 3

            Nun kann MySQL anhand der 1, 2 oder 3 die Datensätze in eine Reihenfolge bringen. Damit hast du erst einmal nach Lagerbestand sortiert. Du wirst eine bestimmte Anzahl Ergebnisse der Ergebnisse der "Kategorie 1" (lager > 0) bekommen, der "Kategorie 2" (lager = 0) und der Kategorie 3 (lager < 0). Innerhalb dieser Kategorien, also bei gleichen Werten im ersten Sortierkriterium, soritert man mit einem zweiten durch Komma angehängtem Kriterium. Das ist in deinem Fall das Datum, das durch ein Komma an mein Beispiel anzuhängen wäre.

            ORDER BY IF(lager >= 1,datum desc, IF(products_quantity <= 0,datum desc,3)
            das ganze müste doch in etwa so aussehen oder? das klappt nur leider überhaupt nicht :-(. irgendwie stehe ich noch auf dem schlauch.

            Nee, siehe oben, aber: nanu, was macht denn products_quantity hier? Ein neues Kriterium? Nun, prinzipiell kannst du natürlich auch unterschiedliche Kriterien miteinander vergleichen, wenn das dein Ziel ist. Hauptsache der Sortierausdruck erzeugt einen vergleichbaren Wert.

            1. müsste das ganze nicht zuerst noch irgendwie gruppiert werden?

            Man gruppiert, wenn man Datensätze anhand von Kriterien _zusammenfassen_ möchte und _nur_ die Ergebnisse je Gruppe braucht. Das kannst du machen, wenn du die Anzahl, den maximalen/minimalen/durschnittlichen/... Wert pro Kriterium benötigst. Gruppieren im "GROUP BY"-Sinne ist also nicht das was du möchtest.

            Lo!