[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Oct 2003
    Beiträge
    170

    Question 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.

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Verstehe die Frage nicht!
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Oct 2003
    Beiträge
    170
    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

  4. #4
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    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

  5. #5
    Registriert seit
    Oct 2003
    Beiträge
    170
    Zitat Zitat von KingofKning Beitrag anzeigen
    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?

  6. #6
    Registriert seit
    Apr 2019
    Beiträge
    43
    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    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
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Oct 2003
    Beiträge
    170
    Zitat Zitat von xenofob Beitrag anzeigen
    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.

  9. #9
    Registriert seit
    Oct 2003
    Beiträge
    170
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    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;
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  11. #11
    Registriert seit
    Oct 2003
    Beiträge
    170
    Zitat Zitat von B.Hauser Beitrag anzeigen
    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!!!

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Bis auf meinen Tippfehler (counter < 20) funktioniert mein SQL aber.
    Ich habe meinen Betrag minimal korrigiert;-).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •