ich habe mir die Finger wund gesucht und konnte für folgendes Problem keine Lösung finden.
Ich habe erfolgreich eine korrelierte Unterabfrage erstellen können, die mir die fortlaufende Summierung einer Spalte ausgibt:
Code: Alles auswählen
SELECT
"A"."Kraut", "A"."Sacknummer", "A"."Gewicht",
( SELECT SUM("B"."Gewicht")
From "Kräuter" as "B"
WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 ) AS "Laufende Summe"
From "Kräuter" as "A"
WHERE
"verkauft" = 0
Jetzt möchte ich gerne die fortlaufende Summe je nach Kraut-Art (Spalte Kraut) haben. Da ich die fortlaufende Summe möchte, kann ich ja nicht mit GROUP BY "Kraut" arbeiten.
Ziel ist eine Ausgabe wie sie der folgende Code produziert, nur für alle Krautarten und dass ich diese natürlich nicht manuell vorgeben möchte:
Code: Alles auswählen
SELECT
"A"."Kraut", "A"."Sacknummer", "A"."Gewicht",
( SELECT SUM("B"."Gewicht")
From "Kräuter" as "B"
WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 AND "Kraut" ='SZr') as "Laufende Summe"
From "Kräuter" as "A"
WHERE
"verkauft" = 0 AND "Kraut" ='SZr'
UNION
SELECT
"A"."Kraut", "A"."Sacknummer", "A"."Gewicht",
( SELECT SUM("B"."Gewicht")
From "Kräuter" as "B"
WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 AND "Kraut" ='P') as "Laufende Summe"
From "Kräuter" as "A"
WHERE
"verkauft" = 0 AND "Kraut" ='P'
Nebenfrage: Kann man die Abfrage eleganter formulieren, so dass die Bedingungen für WHERE nur einmal formuliert werden müssen?
Wo will ich damit hin? Ich möchte eine Liste der Säcke abfragen, deren Gesamtgewicht einer Krautart z.B. mind 100kg entspricht. (Also, ich habe eine Bestellung reinbekommen über 100kg der Krautart D, 50kg von B, jetzt muss eine Packliste erstellt werden, welche Säcke dafür auf eine Palette gepackt werden müssen.)
Gebe ich Krautart und Bestellmenge fest vor, habe ich folgenden Befehl:
Code: Alles auswählen
SELECT
"A"."Kraut", "A"."Sacknummer", "A"."Gewicht",
( SELECT SUM("B"."Gewicht")
From "Kräuter" as "B"
WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 AND "Kraut"='D') AS "Laufende Summe"
From "Kräuter" as "A"
WHERE
"verkauft" = 0 AND "Kraut"='D' AND "Laufende Summe" <=100
Jetzt die Frage, wie bekomme ich auch noch die nächste Zeile mit angezeigt? Weil der Kunde möchte mindestens 100kg haben, nicht weniger. Aber da ich die Liste der Säcke brauche, die 100kg ergeben, kann ich nicht mit
"Laufende Summe" >= 100 LIMIT 1
arbeiten.
Oder muss ich einmal die Abfrage damit laufen lassen und in die erste einbauen?
Code: Alles auswählen
SELECT
"A"."Kraut", "A"."Sacknummer", "A"."Gewicht",
( SELECT SUM("B"."Gewicht")
From "Kräuter" as "B"
WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 AND "Kraut"='D') AS "Laufende Summe"
From "Kräuter" as "A", (SELECT "A"."Kraut", "A"."Sacknummer", "A"."Gewicht", ( SELECT SUM("B"."Gewicht") From "Kräuter" as "B" WHERE "B"."id" <= "A"."id" AND "verkauft" = 0 AND "Kraut"='D') AS "Laufende Summe" From "Kräuter" as "A" WHERE "verkauft" = 0 AND "Kraut"='D' AND "Laufende Summe" >=100 LIMIT 1) AS "Sum_until"
WHERE
"verkauft" = 0 AND "Kraut"='D' AND "Laufende Summe" <= "Sum_until"."Laufende Summe"
Funktionieren würde es zumindest.
Anbei die Datenbank.
Ich würde mich über Denkanstöße und Hinweise freuen.
Vielen Dank!
Grüße,
EinsamerBaumWald