1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

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

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von dash_, 22 Februar 2019.

  1. dash_

    dash_ Benutzer

    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_
     
  2. ukulele

    ukulele Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden