[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Dec 2003
    Beiträge
    106

    Question SQL - eindeutige ID für Satz ?

    Hallo,

    vielleicht kann mir jemand helfen.
    Ich führe unten stehenden SQL mit einem GROUP BY aus.

    Nun möchte ich zusätzlich noch eine eindeutige ID (zahl, 5,0) für jede Ergebniszeile ausgeben.

    Gibts hierfür einen SQL Befehl, Funktion etc... ???
    curRow, curId oder so.....?

    SELECT
    count(*) as anzahl, abrabrtext FROM abrechvgl
    join kbeleg on ABRKBEKY = kbelfdnr
    where kbewanr = 18800 and kbevnr = 1
    group by abrabrtext
    order by 1 desc

    sim

  2. #2
    Markus Reimers Besucher/Guest

    SQL

    Versuchen Sie es doch einmal mit :


    SELECT decimal(rrn(abrechvgl),5,0) as rowID, count(*) as anzahl, abrabrtext FROM abrechvgl
    join kbeleg on ABRKBEKY = kbelfdnr
    where kbewanr = 18800 and kbevnr = 1
    group by 1,2
    order by 2 desc


    RRN(TABLE) : Gibt die Relative Datensatz Nummer aus

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das gibt allerdings einen SQL-Fehler, wenn die RRN > 99999 wird !
    Wofür soll diese ID denn gut sein ?
    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

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Hallo Sim,

    so ganz einfach ist das nicht!
    Es gibt keine Funktion, die einfach eingebunden werden kann.
    Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

    Das heisst jedoch nicht, dass es nicht möglich ist.
    Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:
    PHP-Code:
    with x as (select  count(*) as AnzABRABRTEXT as Text  
                  from ABRECHVGL a  join KBELEG b           
                    on     a
    .ABRKBEKY KBELFDNR            
                 where KBEWANR 
    18800 and KBEVNR 1       
                 group by ABRABRTEXT
    ),                  
         
    as (select  Anz as yAnzText as yText,          
                       
    digits(Anzconcat Text as yKey      
                  from x
    ),                                  
         
    as (select  Anz as zAnzText as zText,          
                       
    digits(Anzconcat Text as zKey      
                  from x
    )                                   
    select yAnzyTextcount(zKey) as Zaehler              
      from y  inner join z                                  
        on yKey 
    >= zKey                                     
      group by yAnz
    yText 
    Vielleicht gibt es ja noch einfachere Lösungen
    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

  5. #5
    Registriert seit
    Dec 2003
    Beiträge
    106

    Thumbs up

    @all
    erstmal vielen dank für die hilfe. ich war schon dabei den
    umweg über eine temporäre tabelle zu machen.

    @Markus Reimers
    Das mit der relativen Satznummer hatte ich schon versucht. Funktioniert aber leider nicht.

    @Fuerchau
    Die ID kennzeichnet alle Kunden einer Gruppe. abrabrtext ist zwar
    schon eindeutig aber als varchar feld nicht unbedingt für die weitere verarbeitung zu gebrauchen ;-)

    @B.Hauser
    dein SQL funktioniert optimal. genau das was ich gebraucht habe.

    thx, sim

  6. #6
    Registriert seit
    Dec 2003
    Beiträge
    106
    Hallo Birgitta,

    eine kurze Erklärung zum SQL wäre nicht schlecht.
    danke. sim

    Zitat Zitat von B.Hauser
    Hallo Sim,

    so ganz einfach ist das nicht!
    Es gibt keine Funktion, die einfach eingebunden werden kann.
    Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

    Das heisst jedoch nicht, dass es nicht möglich ist.
    Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:
    PHP-Code:
    with x as (select  count(*) as AnzABRABRTEXT as Text  
                  from ABRECHVGL a  join KBELEG b           
                    on     a
    .ABRKBEKY KBELFDNR            
                 where KBEWANR 
    18800 and KBEVNR 1       
                 group by ABRABRTEXT
    ),                  
         
    as (select  Anz as yAnzText as yText,          
                       
    digits(Anzconcat Text as yKey      
                  from x
    ),                                  
         
    as (select  Anz as zAnzText as zText,          
                       
    digits(Anzconcat Text as zKey      
                  from x
    )                                   
    select yAnzyTextcount(zKey) as Zaehler              
      from y  inner join z                                  
        on yKey 
    >= zKey                                     
      group by yAnz
    yText 
    Vielleicht gibt es ja noch einfachere Lösungen

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von sim
    Hallo Birgitta,

    eine kurze Erklärung zum SQL wäre nicht schlecht.
    danke. sim
    Ein komplettes Select-Statement besteht aus zwei Teilen:
    1. Common Table Expressions (With ...)
    2. Fullselect --> das eigentliche Select-Statement

    Common Table Expressions (CTE) ermöglichen einem komplexe SQL-Statements besser zu strukturieren. Mit CTEs können temporäre Views, die nur für dieses eine Select-Statement gelten definiert werden. Wie bei anderen Views können auch diese temporären Views in weiteren temporären Views verwendet werden.

    In meinem Beispiel habe ich Dein ursprüngliches Select-Statement als CTE definiert, um das Ergebnis mit neuen Feld-Namen einfacher verwenden zu können.
    Anschliessend habe ich aus dieser CTE zwei weitere Views mit dem selben Aufbau und einem zusätzlichen Schlüssel-Feld, das für die folgenden Verknüpfungen erforderlich ist, definiert.

    Nun zum eigentlichen Select-Statement. Hier wird die Original-Abfrage mit sich selbst verknüpft. Durch die >= Verknüpfung wird jeweils nur die Anzahl der Zeilen bis zum entsprechenden Schlüssel-Wert ermittelt.

    Birgitta
    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

  8. #8
    Unregistriert Besucher/Guest

    Laufende Nr. im SQL / Insert in andere Tabelle

    Zitat Zitat von B.Hauser
    Hallo Sim,

    so ganz einfach ist das nicht!
    Es gibt keine Funktion, die einfach eingebunden werden kann.
    Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

    Das heisst jedoch nicht, dass es nicht möglich ist.
    Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:
    PHP-Code:
    with x as (select  count(*) as AnzABRABRTEXT as Text  
                  from ABRECHVGL a  join KBELEG b           
                    on     a
    .ABRKBEKY KBELFDNR            
                 where KBEWANR 
    18800 and KBEVNR 1       
                 group by ABRABRTEXT
    ),                  
         
    as (select  Anz as yAnzText as yText,          
                       
    digits(Anzconcat Text as yKey      
                  from x
    ),                                  
         
    as (select  Anz as zAnzText as zText,          
                       
    digits(Anzconcat Text as zKey      
                  from x
    )                                   
    select yAnzyTextcount(zKey) as Zaehler              
      from y  inner join z                                  
        on yKey 
    >= zKey                                     
      group by yAnz
    yText 
    Vielleicht gibt es ja noch einfachere Lösungen
    Hallo Forum,

    Der obige "Trick" kam genau zur richtigen Zeit und funktioniert
    prima.

    ABER: Wenn ich das Ergebnis nicht als Resultset sondern in
    eine Tabelle schreiben möchte (also die Zeile "Insert Into lib/File" als erste Zeile der letzten SQL-Anweisung stelle) bekomme ich
    die Fehlermeldung "Schlüsselwort INSERT nicht erwartet. Gültige Token: ( SELECT.

    Was mache ich falsch?

    Danke schon mal für die Mühen.

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Zitat Zitat von Unregistriert
    Hallo Forum,

    Der obige "Trick" kam genau zur richtigen Zeit und funktioniert
    prima.

    ABER: Wenn ich das Ergebnis nicht als Resultset sondern in
    eine Tabelle schreiben möchte (also die Zeile "Insert Into lib/File" als erste Zeile der letzten SQL-Anweisung stelle) bekomme ich
    die Fehlermeldung "Schlüsselwort INSERT nicht erwartet. Gültige Token: ( SELECT.

    Was mache ich falsch?

    Danke schon mal für die Mühen.
    Commont Table Expressions gehören zum SELECT statement und zu keinem anderen Statement.
    Ein vollständiges SELECT-Statement besteht aus Common Table Expressions und einem Full-Select.

    Wenn Du also Sätze in eine bestehende Datei einfügen willst,
    musst du das komplette Select-Statement (mit allen CTEs) innerhalb des Inserts angeben:

    Beispiel:
    PHP-Code:
    insert into MySchema/MyTable
    with x 
    as (select  count(*) as AnzABRABRTEXT as Text   
                  from ABRECHVGL a  join KBELEG b            
                    on     a
    .ABRKBEKY KBELFDNR             
                 where KBEWANR 
    18800 and KBEVNR 1        
                 group by ABRABRTEXT
    ),                   
         
    as (select  Anz as yAnzText as yText,           
                       
    digits(Anzconcat Text as yKey       
                  from x
    ),                                   
         
    as (select  Anz as zAnzText as zText,           
                       
    digits(Anzconcat Text as zKey       
                  from x
    )                                    
    select yAnzyTextcount(zKey) as Zaehler               
      from y  inner join z                                   
        on yKey 
    >= zKey                                      
      group by yAnz
    yText 
    Birgitta
    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

  10. #10
    Unregistriert Besucher/Guest
    Zitat Zitat von B.Hauser
    Commont Table Expressions gehören zum SELECT statement und zu keinem anderen Statement.
    Ein vollständiges SELECT-Statement besteht aus Common Table Expressions und einem Full-Select.

    Wenn Du also Sätze in eine bestehende Datei einfügen willst,
    musst du das komplette Select-Statement (mit allen CTEs) innerhalb des Inserts angeben:

    Beispiel:
    PHP-Code:
    insert into MySchema/MyTable
    with x 
    as (select  count(*) as AnzABRABRTEXT as Text   
                  from ABRECHVGL a  join KBELEG b            
                    on     a
    .ABRKBEKY KBELFDNR             
                 where KBEWANR 
    18800 and KBEVNR 1        
                 group by ABRABRTEXT
    ),                   
         
    as (select  Anz as yAnzText as yText,           
                       
    digits(Anzconcat Text as yKey       
                  from x
    ),                                   
         
    as (select  Anz as zAnzText as zText,           
                       
    digits(Anzconcat Text as zKey       
                  from x
    )                                    
    select yAnzyTextcount(zKey) as Zaehler               
      from y  inner join z                                   
        on yKey 
    >= zKey                                      
      group by yAnz
    yText 
    Birgitta
    Vielen Dank, hat mich wieder ein großes Stück weiter gebracht.

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. embedded SQL, Satz geschützt
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 01-12-05, 18:12

Berechtigungen

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