Darstellung einzelne Anzahl von Gesamtanzahl (1von2, 2von2...)

digor

Benutzer
Beiträge
13
Hallo zusammen,

die Datenbank enthält Artikel und die Gesamtmenge. Die erwünschte Ausgabe wäre wie die Seitenzählung "1 von 3; 2 von 3; 3 von 3" erwünscht. Würde es in MySQL gehen? Besten Dank für Eure Unterstützung!

Viele Grüße
digor
 

Anhänge

  • 30-06-2025_16-57-31.webp
    30-06-2025_16-57-31.webp
    20,8 KB · Aufrufe: 7
Werbung:
Lege mal das vreate von der tabelle(n) mit ein paar Spieldaten hier ab. Un wichtig ist noch welche MySQL/MariaDB Version du einsetzt.

SELECT VERSEION();

Gruß

Bernd
 
Du kannst das zb. So erreichen:

Code:
WITH RECURSIVE myseq AS (
  SELECT 1 AS n
  UNION ALL
  SELECT n + 1
  FROM myseq
  WHERE n < 10
)
SELECT a.Artikel,
       a.Menge,
       a.Fertigungslinie,
       myseq.n AS EinzelneAnzahl,
       CONCAT(myseq.n,' von ',a.Menge) as Anzahl
FROM dbmytab AS a
LEFT JOIN myseq
  ON myseq.n <= a.Menge
ORDER BY a.Artikel, myseq.n;


Ergebnis:


Code:
Artikel    Menge    Fertigungslinie    EinzelneAnzahl    Anzahl
1000    4    A    1    1 von 4
1000    4    A    2    2 von 4
1000    4    A    3    3 von 4
1000    4    A    4    4 von 4
2000    3    A    1    1 von 3
2000    3    A    2    2 von 3
2000    3    A    3    3 von 3
3000    2    B    1    1 von 2
3000    2    B    2    2 von 2
4000    2    C    1    1 von 2
4000    2    C    2    2 von 2


Tabelle

Code:
id    Artikel    Menge    Fertigungslinie
1    1000    4    A
2    2000    3    A
3    3000    2    B
4    4000    2    C

Gruß

Bernd
 
Hallo Bernd,

besten Dank für schnelle Antworten! Ich bin so langsam 🙈 Ich Deinen Vorschlag testen.
Version: MySQL 8.0.37.

Die Tabelle wäre unten stehend. Ich bin nicht nur mit der Artikelnummer gebunden sondern auch mit der Auftragsnummer und dazugehörigen Position im Auftrag.

CREATE TABLE
pos_test (
id int PRIMARY KEY,
pos int,
auftrag int NOT NULL,
artikel int,
menge int,
fertigung varchar(4)
);

INSERT INTO
pos_test (id, pos, auftrag, artikel, menge, fertigung)
VALUES
(1, 1, 101101, 1000, 4, 'A'),
(2, 1, 101102, 2000, 3, 'A'),
(3, 2, 101102, 3000, 2, 'B'),
(4, 3, 101102, 4000, 2, 'C'),
(5, 1, 101103, 1000, 8, 'A'),
(6, 2, 101103, 3000, 12, 'B'),
(7, 1, 102000, 2000, 6, 'A'),
(8, 2, 102000, 4000, 9, 'C'),
(9, 3, 102000, 6000, 5, 'B'),
(10, 4, 102000, 8000, 8, 'C');
 
Die Aufgabenstellung in Post #1 ergibt wenig Sinn. Wieso gibt es bereits eine Menge in der Tabelle, müsste die nicht erstmal berechnet werden? In den Beispieldaten ergibt sich "Anzahl von" aus "einzelne Anzahl" und "Menge" als Text verkettet.

Die Lösung von @BerndB in allen Ehren,. aber auch die ergibt nicht wirklich Sinn. Er zählt per Rekursion bis 10 und joint, um dann zu sortieren und die Zeilennummer als Text zu verwenden. Viel effizienter wäre eine Window-Funktion wie ROW_NUMBER(), die sollte es auch in MySQL geben oder? Rekursion ist fancy, bietet hier aber Fehlerpotential. Was ist z.B., wenn es mal mehr als 10 Datensätze sind, sagen wir 10k? Rekursion hat ihre Grenzen und ist hier eher Kanonen auf Spatzen.

Deine Testdaten sind dann wohl formatiert und auch die Menge schwankt, es gibt also keine Abhängigkeit mehr. Ich denke mal mit Menge sind also einzelne Produktionsmengen gemeint, die irgendwo Sinn ergeben. Dafür ist nicht ganz klar, welche Rolle jetzt die Fertigungslinie spielt, ob die zusammen fließen dürfen, etc. das überlasse ich mal dem OP. Ich lese daraus das alles mit dem selben "auftrag" zusammen gehört und nach "pos" sortiert gezählt wird. pos ist damit effektiv auch die Zeilennummer, dann braucht es keine Sequenz und keine Window-Function an der Stelle. Die max_pos kann man sehr klassisch mit GROUP BY ermitteln und joinen, dann hat man alles, was man braucht und benötigt keine Rekursion (auch wenn die manchmal ein gutes Werkzeug sein kann).

Code:
WITH t AS (
SELECT    auftrag,
        max(pos) AS max_pos
FROM    pos_test
GROUP BY auftrag
    )
SELECT    pos_test.*,
        CONCAT(pos,' von ',t.max_pos) AS 'Anzahl von'
FROM    pos_test
LEFT JOIN t
ON        pos_test.auftrag = t.auftrag
ORDER BY pos_test.auftrag,pos_test.pos

Bei Bedarf kann dann mit Window-Funktionen noch ein running total oder sowas dazu kommen.

Code:
WITH t AS (
SELECT    auftrag,
        max(pos) AS max_pos
FROM    pos_test
GROUP BY auftrag
    )
SELECT    pos_test.*,
        CONCAT(pos_test.pos,' von ',t.max_pos) AS 'Anzahl von',
        sum(pos_test.menge) OVER (PARTITION BY pos_test.auftrag ORDER BY pos_test.pos) AS 'laufende Summe'
FROM    pos_test
LEFT JOIN t
ON        pos_test.auftrag = t.auftrag
ORDER BY pos_test.auftrag,pos_test.pos

Auch weitere Unterteilungen nach Fertigungslinie sind möglich.
 
Hallo ukulele,

vielen Dank für den Post!
Wieso gibt es bereits eine Menge in der Tabelle, müsste die nicht erstmal berechnet werden?
Die Frage kann ich gut nachvollziehen. In meinem aktuellen Fall ist es umgekehrt. Zunächst wird der Auftrag mit Positionen und Mengen erfasst.
Nach der Fertigung werden die Teile einzelne etikettiert. D.h., dass die Gesamtmenge einer Auftragsposition soll auf Stückgröße 1 zerlegt werden. Jedes Stück bekommt ein Etikett mit der Angabe: Auftrag, Pos, Artikel, Fertigung und Anzahl 1 von "Gesamtmenge".


Die Lösung von @BerndB in allen Ehren,. aber auch die ergibt nicht wirklich Sinn. Er zählt per Rekursion bis 10 und joint, um dann zu sortieren und die Zeilennummer als Text zu verwenden. Viel effizienter wäre eine Window-Funktion wie ROW_NUMBER(), die sollte es auch in MySQL geben oder? Rekursion ist fancy, bietet hier aber Fehlerpotential. Was ist z.B., wenn es mal mehr als 10 Datensätze sind, sagen wir 10k? Rekursion hat ihre Grenzen und ist hier eher Kanonen auf Spatzen.
Du hast sicher Recht mit der max. Rekursion. Bei mir wird es nicht mehr als 100 sein.

Viele Grüße
 
Werbung:
Okay dann hast du quasi eine Soll-Menge und eine Ist-Menge.

Mit meinem zweiten Code-Beispiel kannst du auch die Mengen aufrechnen.
 
Zurück
Oben