Matrix, Spalten zusammen rechnen und bei einem erreichten Wert in die nächste Zeile

dash_

Benutzer
Beiträge
15
Sehr geehrte und liebe Forumsmitglieder,

ich zerbreche mir schon seit Tagen den Kopf, aus einer .csv Datei die ich von jemanden bekomme eine Lieferübersicht zu erstellen.
Kurz zum Aufbau der .CSV Datei, da Sie eins zu eins so in eine DB importiert wird:
Datum, Zeit, Auftrag, Menge, Status, Art01, Art02, Art03 ...

So sieht meine Liste derzeit aus:
upload_2019-2-22_9-30-21.png

Kurze Erklärung:
Links: 05, 06,07 usw ist die Zeitspanne (05 = 05-06 Uhr) Rechts: Das Gesamtergebnis der Zeitspanne
In der Mitte die Artikel mit den jeweiligen Mengen.
Sofern hinten das Gesamtergebnis, der Spalten nicht 21 ergibt, soll er die Mengen von unten dazu rechnen bis es 21 ergibt, dazu aber natürlich dann von unten der Zeitspanne Weg nehmen, bis keine Aufträge mehr am Tag da sind, damit ein Sprinter nicht nur halbvoll durch die gegen fährt.

Ist das mit SQL realisierbar, damit es in Zukunft nicht manuell gemacht werden muss?

Wenn ja, wäre es schön paar Denkanstöße zu bekommen?

Falls etwas nicht verständlich ist, scheut euch nicht zu fragen. Ich bin leider wirklich nicht der beste Erklärer. :p

Ich bedanke mich schon im Voraus.
Gruß
dash_
 
Werbung:
Ja es ist möglich, ich vermute mit CTE. Das Meiste ist für mich aber noch nicht ganz nachvollziehbar. Du willst die rechte Spalte aufaddieren in der Reihenfolge der Linken bis die Summe rechts über oder maximal 21 beträgt? Oder soll ein Rest dann in die Nächste Ladung zählen?

Willst du nur die nächste Ladung dazu zählen solange du unter 21 bleibst würden nur zwei Zeilen zusammen gefasst, aber was passiert wenn eine eigentliche Ladung schon über 21 liegt?
Code:
WITH tabelle(zeitraum,menge) AS (
   SELECT '05',12 UNION ALL
   SELECT '06',11 UNION ALL
   SELECT '07',16 UNION ALL
   SELECT '08',7 UNION ALL
   SELECT '09',11 UNION ALL
   SELECT '10',12
   ), test(zeile,zeitraum,menge) AS (
   SELECT   ROW_NUMBER() OVER (ORDER BY zeitraum ASC),
           zeitraum,
           menge
   FROM   tabelle
   ), t(zeile,zeitraum_von,zeitraum_bis,menge) AS (
   SELECT   test.zeile,
           test.zeitraum,
           test.zeitraum,
           test.menge
   FROM   test
   WHERE   test.zeile = 1 --Startpunkt
   UNION ALL
   SELECT   test.zeile,
           (CASE WHEN t.menge + test.menge <= 21 THEN t.zeitraum_von ELSE test.zeitraum END),
           test.zeitraum,
           (CASE WHEN t.menge + test.menge <= 21 THEN t.menge + test.menge ELSE test.menge END)
   FROM   t
   INNER JOIN test
   ON       t.zeile + 1 = test.zeile
   )
SELECT   zeitraum_von,
       max(zeitraum_bis) AS zeitraum_bis,
       max(menge) AS menge
FROM   t
GROUP BY zeitraum_von
 
Zurück
Oben