[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    32

    per SQL oder RPG doppelte Texte ermitteln

    Hallo Zusammen,
    ich schreibe Auftragstexte in eine Datei.
    Felder sind: Auftragsnummer, Text
    4711 Zeile1
    4711 Zeile2
    4711 Zeile3
    4712 Zeile1
    4713 Zeile1
    4713 Zeile2
    ...
    Jeder Auftrag kann beliebig viele Zeilen haben.
    Ich möchte herausfinden, bei welchen Aufträgen der komplette Text identisch ist (Anzahl der Zeilen und Inhalt)

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    select Text, count(*) from TextTable
    Group by Text

    oder
    select Text, count(*) from TextTable
    Group by Text
    having count(*) > 1

    Da es unterschiedliche Schreibweisen geben könnte:

    select hugo.*, count(*) from (
    select upper(replace(Text, ' ', '')) from TextTable
    ) hugo
    Group by Text
    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
    Aug 2001
    Beiträge
    2.873
    Ich würde zunächst die Texte pro Auftrag (über alle Zeilen) ermitteln.
    Im nächsten Schritt würde ich dann feststellen, welche Texte mehrfach vorkommen.
    Und zum Schluss dann die Aufträge mit den mehrfachvorkommenden Texten ausgeben.

    Etwa so:
    Code:
    With x as (Select Auftrag, ListAgg(Trim(Text), '') TextProAuftrag
                 from YourTable
                 group by Auftrag),
         y as (Select TextProAuftrag
                 from x
                 Group By TextProAuftrag
                 Having Count(*) > 1)       
    Select Auftrag, x.TextProAuftrag 
      from y join x on y.TextProAuftrag = x.TextProAuftrag
      Order BY TextProAuftrag;
    Sollte das IBM i Release so alt sein, dass LISTAGG nicht vorhanden ist, kann man sich mit einer Rekursion behelfen oder sich seine eigene Funktion schreiben, beides ist auf alle Fälle um einiges aufwändiger.
    ... allerdings weniger aufwändig als das gleiche mit reinem RPG zu schreiben.

    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

  4. #4
    Registriert seit
    Apr 2019
    Beiträge
    43
    Bin mir jetzt unsicher ob ich das falsch verstanden habe, aber trotzdem hier:

    Select Auftragsnummer from Auftragsdatei
    where exists (select b.auftragsnummer from Auftragsdatei b
    where b.text not in (Select c.text from Auftragsdatei c)

    SQL von hinten lesen, sonst blickt man schwer durch!

  5. #5
    Registriert seit
    Sep 2005
    Beiträge
    32
    Die Antwort von Birgitta trifft die Sache auf den Kopf. Danke dafür.
    LISTAGG war mir nicht bekannt. Funktioniert aber super. So kann ich herausfinden welche Texte im ganzen doppelt sind. Es reicht mir ja nicht zu wissen, dass eine Textzeile auch in einem anderen Auftrag vorkommt aber die anderen Zeilen unterschiedlich sind.
    Problem gelöst.
    DANKE

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Birgitta vergleicht die kompletten Auftragstexte zueinander, da ListAgg die Texte aneinander kettet.
    Daher wird da zu deinem Beispiel nichts bei rauskommen.

    " bei welchen Aufträgen der komplette Text identisch ist (Anzahl der Zeilen und Inhalt "

    4711 Zeile1 Zeile2 Zeile3
    4712 Zeile1
    4713 Zeile1 Zeile2

    Dein SQL hilft da auch nicht, da:
    where b.text not in (Select c.text from Auftragsdatei c)
    sich selber nicht ausschließt, da b.Text in C.Text ja vorhanden ist. Hier sollte u.U. b.Auftrag <> c.Auftrag eingeschlossen werden.

    Noch mal die Frage:
    Sollen nur gleiche Zeilen oder gleiche Texte ermittelt werden?

    Du könnstest auch

    select Text, count(distinct Auftrag)
    from Auftragstexte
    having count(distinct Auftrag) > 1

    verwenden um doppelte Zeilen zu ermitteln. Dieses Ergebnis mit sich selber verjoint ergibt dann die Aufträge:

    select * from (
    select Text, count(distinct Auftrag)
    from Auftragstexte
    having count(distinct Auftrag) > 1
    ) h
    inner join Auftragstexte A
    h.Text = A.Text
    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

  7. #7
    Registriert seit
    Apr 2019
    Beiträge
    43
    Select Auftragsnummer from Auftragsdatei
    where exists (select b.auftragsnummer from Auftragsdatei b
    where b.text not in (Select c.text from Auftragsdatei c where c.auftragsnummer <> b.auftragsnummer)

    @fuerchau: absolut korrekt! Dann müsste der sql aber passen.

  8. #8
    Registriert seit
    Sep 2005
    Beiträge
    32
    Ein Auftrag kann beliebige Zeilen Text haben. In meinem Beispiel besteht Auftrag 4711 aus 3 Zeilen Text. Ich möchte wissen, welche Aufträge den identischen Text haben. Und zwar identisch in der Anzahl der Zeilen und identisch im Inhalt. In meinem Beispiel gibt es keine identischen Aufträge, da der Text "Zeile 1" zwar in mehreren Aufträgen vorkommt, aber z.B. bei Auftrag 4713 die 3. Zeile fehlt.

    Vielleicht hätte ich besser klarmachen sollen, dass es mir NICHT reicht, in welchen Aufträgen die Textzeile "Zeile 1" vorkommt, sondern ich möchte den kompletten Text eines Auftrags vergleichen.
    Anzahl der Textzeilen und Inhalt der Textzeilen müssen identische sein. Und das bringt mir der ListAgg

Similar Threads

  1. AS400 doppelte Datensätze
    By pabloesco in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 11-10-19, 20:04
  2. SQL Texte in unterschiedlicher länge
    By Robi in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-02-17, 11:46
  3. Ermitteln ob aktuelles Programm ineraktiv läuft oder im Batch
    By harkne in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 20-05-16, 14:34
  4. Kann man Sourcefiles im IFS speichern und die Texte behalten?
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 29
    Letzter Beitrag: 19-05-16, 10:39
  5. Farbige Texte im SEU
    By danielfeurstein in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 09-08-02, 09:57

Tags for this Thread

Berechtigungen

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