-
SQL Lines verdoppeln bzw. abhängig von Menge verdoppeln
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.
-
Verstehe die Frage nicht!
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
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
-
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
-
Zitat von KingofKning
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?
-
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
-
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
-
Zitat von xenofob
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.
-
Zitat von Fuerchau
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
-
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:
Code:
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)
Code:
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;
-
Zitat von B.Hauser
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:
Code:
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)
Code:
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;
VIELEN DANK hat super funktioniert habe mein Problem mit deiner Lösung lösen können!!!
-
Bis auf meinen Tippfehler (counter < 20) funktioniert mein SQL aber.
Ich habe meinen Betrag minimal korrigiert;-).
Tags for this Thread
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks