[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2003
    Beiträge
    290

    SQL Auswertung 5 Felder im Datensatz ...suche nach identischem Inhalt

    Hallo zusammen,
    ich habe in einem Kundenstamm 5 Felder, je 3A, in denen ein 3-stelliger Schlüssel steht, dieser
    representiert den zuständigen Sachbearbeiter für den jeweiligen Kunden.
    Nach einer Neuorganisation der Schlüssel habe ich jetzt bei einigen Kunden Schlüssel mehrfach in den 5 Feldern.

    Kennt jemand eine galante SQL Lösung für die Ermittlung solcher Kunden ????
    Ich kann natürlich alle 5 Felder gegeneinander auf gleichen Inhalt prüfen, viel Code ...
    Vielleicht gibt es ja eine bessere Lösung.

    Vielen Dank im Voraus.
    Peet

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Im Prinzip "unpivot":

    select * from (
    select Kunde, SB1 as SB, 'SB1' as Feld from Tabelle
    union
    select Kunde, SB2, 'SB2' as Feld from Tabelle
    :
    ) k
    where SB ...
    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

  3. #3
    Registriert seit
    Jan 2003
    Beiträge
    290
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Im Prinzip "unpivot":

    select * from (
    select Kunde, SB1 as SB, 'SB1' as Feld from Tabelle
    union
    select Kunde, SB2, 'SB2' as Feld from Tabelle
    :
    ) k
    where SB ...
    Danke, das ist natürlich eine Idee...ich baue das mal zusammen.
    Vg.

  4. #4
    Registriert seit
    Oct 2019
    Beiträge
    16
    Hier eine Variante die die Duplikate entfernt und die Daten wieder in der originalform bereitstellt:
    Code:
    with
      kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
        values
          (1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
          (2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
      ),
    
      unpivot as (
        select distinct
          kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
        from
          kunden
          cross join lateral(
            values (knz1), (knz2), (knz3), (knz4), (knz5)
          ) as dt(knz)
      )
    
    select
      kdnr,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 1), '') as knz1,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 2), '') as knz2,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 3), '') as knz3,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 4), '') as knz4,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 5), '') as knz5
    from
      kunden

  5. #5
    Registriert seit
    Jan 2003
    Beiträge
    290
    Wow, vielen Dank !
    Vg.

    Zitat Zitat von Ahoy Beitrag anzeigen
    Hier eine Variante die die Duplikate entfernt und die Daten wieder in der originalform bereitstellt:
    Code:
    with
      kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
        values
          (1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
          (2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
      ),
    
      unpivot as (
        select distinct
          kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
        from
          kunden
          cross join lateral(
            values (knz1), (knz2), (knz3), (knz4), (knz5)
          ) as dt(knz)
      )
    
    select
      kdnr,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 1), '') as knz1,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 2), '') as knz2,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 3), '') as knz3,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 4), '') as knz4,
      ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 5), '') as knz5
    from
      kunden

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Man kann das Ganze noch um einige Sub-Selects reduzieren:
    Code:
    with
      kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
        values
          (1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
          (2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
      ),
      unpivot as (
        select distinct
          kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
        from
          kunden
          cross join lateral(
            values (knz1), (knz2), (knz3), (knz4), (knz5)
          ) as dt(knz)
      )
    select KDNR, Coalesce(Min(Case When knzNr = 1 Then KNZ End), '') as KNZ1,
                 Coalesce(Min(Case When knzNr = 2 Then KNZ End), '') as KNZ2,
                 Coalesce(Min(Case When KnzNr = 3 Then KNZ End), '') as KNZ3,
                 Coalesce(Min(Case When KnzNr = 4 Then KNZ End), '') as KNZ4,
                 Coalesce(Min(Case When KnzNr = 5 Then KNZ End), '') as KNZ5
      From Unpivot
      Group by KdNr;
    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Der cross join lateral reicht ja schon.
    Der nachfolgende Selekt bringt die Felder ja wieder nebenenander.
    Die Funktion Values mit Komma mehrere Zeilen zu erstellen hatte ich nicht mehr auf dem Schirm.
    Das liegt auch daran, dass dies nicht in jedem Dialekt (SQL-Server, Oracle, Firebird, ...) unterstützt wird.
    Das spart den Union.
    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

Similar Threads

  1. sql-Auswertung für Anwender erstellen
    By rr2001 in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 09-01-14, 15:19
  2. nach Insert neu gen. Datensatz ermitteln
    By M.Kasper in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 25-08-06, 07:32
  3. Antworten: 16
    Letzter Beitrag: 31-01-06, 09:41
  4. Datensatz von Tabelle A nach Tabelle B
    By Schorsch in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 07-05-04, 11:18
  5. CA-Verbindung beendet sich nach jedem ODBC Datensatz
    By Carsten in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 22-01-02, 08:15

Berechtigungen

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