PDA

View Full Version : SQL Lines verdoppeln bzw. abhängig von Menge verdoppeln



Seiten : [1] 2

Miles
24-08-20, 11:21
Hallo zusammen,

ich gerade ein problem ich muss ein Report erstellen und habe noch keine Idee wie ich es umsetzen soll.

Ich muss als beispiel:

Auftrag, Artikel, Bez., Menge
AB1, TESTID, TEST Beschreibung, 5

Aber ausgeben soll ich
Auftrag,Artikel, Bez., Menge
AB1,TESTID, TEST Beschreibung, 1
AB1,TESTID, TEST Beschreibung, 1
AB1,TESTID, TEST Beschreibung, 1
AB1,TESTID, TEST Beschreibung, 1
AB1,TESTID, TEST Beschreibung, 1

Hat jemand eine Idee wie man dies per SQL lösen könnte?

Danke schon mal.

Robi
24-08-20, 12:24
Verstehe die Frage nicht!

Miles
24-08-20, 13:02
Ich bekommen aus meinem SQL eine Line zurück z.B:

Auftrag, Artikel, Bez., Menge
AB1, TESTID, TEST Beschreibung, 5

Aber ich muss es die Menge immer mit 1 zurück geben.
Auftrag, Artikel, Bez., Menge
AB1, TESTID, TEST Beschreibung, 1
AB1, TESTID, TEST Beschreibung, 1
AB1, TESTID, TEST Beschreibung, 1
AB1, TESTID, TEST Beschreibung, 1
AB1, TESTID, TEST Beschreibung, 1

KingofKning
24-08-20, 13:05
Eigentlich nur mit einem temp File. Sprich du machst Dein SQL und per Funktion wird in Abhängigkeit der Menge jeweils die Anzahl der Sätze in eine temp-Datei geschrieben.

GG 3932

Miles
24-08-20, 13:13
Eigentlich nur mit einem temp File. Sprich du machst Dein SQL und per Funktion wird in Abhängigkeit der Menge jeweils die Anzahl der Sätze in eine temp-Datei geschrieben.

GG 3932

@KingofKning, wie meinst du das hast du ein Beispiel eventuell?

xenofob
24-08-20, 14:59
BEGIN ATOMIC

DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE CNT INT DEFAULT 1; DECLARE AUF CHAR(10); // für 1 Auftrag
DECLARE CUR CURSOR FOR SELECT DISTINCT AUFTRAG FROM Auftragsdatei; // Alle Aufträge


OPEN CUR;
FETCH CUR INTO AUF;

WHILE SQLCODE = 0 DO

SET CNT = 1;

WHILE CNT <= (SELECT MENGE FROM Auftragsdatei WHERE Auftrag = AUF) DO


INSERT INTO Ausgabedatei SELECT AUFTRAG, ARTIKEL, BEZ, 1 from Auftragsdatei
WHERE AUFTRAG = Auf;
SET CNT = CNT + 1;

END WHILE;

FETCH CUR INTO Auf; // Nachlesen

END WHILE;
END;

Wenn noch jemand wüsste wie man den Insert als result an den Client zurückschickt, wäre das natürlich optimal :)

Fuerchau
24-08-20, 15:12
Du kannst eine rekursive CTE machen und diese als Join angeben:

with counter (value) as (
values(1)
union all
select value+1 from counter
where value < 20
)

select * from file a
inner join counter b on a.value <= b.value

Mittels With-Table generierst du künstlich die Zahlenfolge 1 - n (1-20, die 20 kannst du auch ändern)
Da ein Join nicht zwangsweise mit "=" erfolgen muss, kannst du nun entweder eine dynamische Verbindung, falls die gewünschte Anzahl in der Quelle) oder eine konstante Anzahl verwwenden:

select * from file a
inner join counter b on b.value <= 5

Miles
26-08-20, 13:27
BEGIN ATOMIC

DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE CNT INT DEFAULT 1; DECLARE AUF CHAR(10); // für 1 Auftrag
DECLARE CUR CURSOR FOR SELECT DISTINCT AUFTRAG FROM Auftragsdatei; // Alle Aufträge


OPEN CUR;
FETCH CUR INTO AUF;

WHILE SQLCODE = 0 DO

SET CNT = 1;

WHILE CNT <= (SELECT MENGE FROM Auftragsdatei WHERE Auftrag = AUF) DO


INSERT INTO Ausgabedatei SELECT AUFTRAG, ARTIKEL, BEZ, 1 from Auftragsdatei
WHERE AUFTRAG = Auf;
SET CNT = CNT + 1;

END WHILE;

FETCH CUR INTO Auf; // Nachlesen

END WHILE;
END;

Wenn noch jemand wüsste wie man den Insert als result an den Client zurückschickt, wäre das natürlich optimal :)

Danke test ich, gebe mal zurück wie es funktioniert hat.

Miles
26-08-20, 13:28
Du kannst eine rekursive CTE machen und diese als Join angeben:

with counter (value) as (
values(1)
union all
select value+1 from counter
where counter < 20
)

select * from file a
inner join counter b on a.value <= b.value

Mittels With-Table generierst du künstlich die Zahlenfolge 1 - n (1-20, die 20 kannst du auch ändern)
Da ein Join nicht zwangsweise mit "=" erfolgen muss, kannst du nun entweder eine dynamische Verbindung, falls die gewünschte Anzahl in der Quelle) oder eine konstante Anzahl verwwenden:

select * from file a
inner join counter b on b.value <= 5

Ich es probiert aber leider funktionier das SQL nicht.
I wollte erst mal mir nur das ergebnis aus counter anzeigen lassen bekomme die Fehlermung
"Column or global variable COUNTER not found." Verstehe leider nicht warum?

with counter (value) as (
values(1)
union all
select value+1 from counter
where counter < 20
)
select * from counter

B.Hauser
26-08-20, 13:45
Das SQL-Statement kann auch nicht funktionieren, da es nicht korrekt ist!

Counter ist eine Common Table Expression und keine Spalte. Der Spalten-Name ist VALUE.
Wenn Du das Statement wie folgt änderst, funktioniert es auch:


with counter (value) as ( values(1)
union all
select value + 1 from counter
where value < 20)
select * from counter ;

Im Übrigen stimmt das komplette Statement auch nicht. Wenn Du es jedoch wie folgt änderst, sollte es funktionieren. (Anstatt der Datei habe ich eine Dummy-Datei über eine Common Table Expression generiert, mit 4 Sätze und jeweils 2 Spalten, den Text und die Anzahl/Number)


with counter (value) as ( values(1)
union all
select value + 1 from counter
where value < 20),
File (Text, Number) as (Values('ABC', 5),
('XXX', 3),
('YYY', 7),
('ZZZ', 1))
select Text, 1, a.*, b.*
from File a inner join Counter b on Number >= Value
Order By Text;