Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

LISTAGG - verbinden von Texten zu einer Zeichenkette

Dieses Thema im Forum "Oracle" wurde erstellt von jan99, 3 Februar 2015.

  1. jan99

    jan99 Benutzer

    Moin !

    ich habe eine Abfrage für Adressen in unserer Datenbank.

    SELECT
    LAGE2.BEZEICHNUNG, HSNR.HAUSNUMMER
    from AX_LAGBEZMITHNR HSNR,
    AX_LAGEBEZEICHNUNG LAGE1,
    AX_LAGBEZKATALOGEINTG LAGE2,
    AX_GEBAEUDE G
    WHERE HSNR.FID_BEZIEHTSICHAUF = G.FID
    AND LAGE1.FID = HSNR.FID_LAGEBEZEICHNUNG
    AND LAGE1.land||LAGE1.regierungsbezirk||LAGE1.kreis||LAGE1.gemeinde||LAGE1.lage = LAGE2.SCHLUESSELGESAMT
    AND G.FID = 4774647
    ORDER BY 2

    In der Regel wird immer nur eine Adresse zurückgegeben - aber es gibt auch die anderen Fälle, wo mehrere Adressen zuückgegeben werden.

    Das Standardergebnis sieht wie folgt aus:

    BEZEICHNUNG HAUSNUMMER
    ----------- ----------
    Achternhof 15
    Achternhof 17
    Achternhof 19
    Achternhof 21
    4 rows selected.
    Nun wollte ich diese Adressen gerne für die nächste Anwendung zu einer Zeichenkette zusammenfassen und habe hierzu LISTAGG gefunden.

    Damit die zusammengehörigen Straßennamen und die Adressse erst einmal ein Wert sind habe ich folgende Anpassung vorgenommen:

    SELECT
    LAGE2.BEZEICHNUNG, HSNR.HAUSNUMMER,
    LAGE2.BEZEICHNUNG||' '||HSNR.HAUSNUMMER Volladresse
    FROM
    ...

    Das funktioniert auch schon einmal wieder. Nun sollte die Zusammenfassung kommen und da ist mein Problem...


    SELECT
    LAGE2.BEZEICHNUNG, HSNR.HAUSNUMMER,
    LAGE2.BEZEICHNUNG||' '||HSNR.HAUSNUMMER Volladresse,
    LISTAGG(Volladresse, ' , ') within group Volladresse
    from AX_LAGBEZMITHNR HSNR,
    AX_LAGEBEZEICHNUNG LAGE1,
    AX_LAGBEZKATALOGEINTG LAGE2,
    AX_GEBAEUDE G
    WHERE HSNR.FID_BEZIEHTSICHAUF = G.FID
    AND LAGE1.FID = HSNR.FID_LAGEBEZEICHNUNG
    AND LAGE1.land||LAGE1.regierungsbezirk||LAGE1.kreis||LAGE1.gemeinde||LAGE1.lage = LAGE2.SCHLUESSELGESAMT
    AND G.FID = 4774647
    ORDER BY 2

    Wenn ich diese Abfrage ausführe, dann bekomme ich die Fehlermeldung:

    SQL execution error, ORA-00906: Linke Klammer fehlt

    Aber welche Klammer soll da fehlen oder wo ist mein grundlegender Fehler ? Ich habe doch nur die beiden Klammern im Rahmen von LISTAGG verwendet !!!

    Kann mir einer weiterhelfen ?

    Gruß Jan
     
  2. akretschmer

    akretschmer Datenbank-Guru

    ich denke mal, Du mußt dann nach den anderen Spalten gruppieren, da Du ja eine Aggregatsfunktion hast. Zumindest ist PostgreSQL ist das so, dort wöre die Fehlermeldung auch eindeutiger.
     
  3. Distrilec

    Distrilec Datenbank-Guru

    In diesem Fall fehlt wirklich nur ne Linke Klammer :)
    Code:
    LISTAGG (measure_column [, 'delimiter'])  WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)]
    Das ist die Syntax der Listagg-Funktion -> Klammer nach dem group ist pflicht und auch die order_by-Clause :)

    Dass das Group By fehlt kommt dann noch hinzu...
     
    akretschmer gefällt das.
  4. jan99

    jan99 Benutzer

    Moin !

    erst einmal Danke - ich habe mich mal daran versucht (ehrlich: bin noch etwas "wackelig auf den SQL-Beinen")

    Daraus ist jetzt

    ..
    LAGE2.BEZEICHNUNG, HSNR.HAUSNUMMER HNr,
    LAGE2.BEZEICHNUNG||' '||HSNR.HAUSNUMMER Volladresse,
    LISTAGG(Volladresse, ' , ') within GROUP (order by Volladresse) ZusammengefassteAdresse

    geworden.

    Bekomme aber eine neue Fehlermeldung mit der ich nicht so ganz klar komme.
    "
    SQL execution error, Der Spaltenname 'VOLLADRESSE' fehlt bzw. ist ungültig."

    Aber was soll da jetzt wo ungültig sein mit dem Namen ?

    Kann mir nochmal einer weiterhelfen ?

    Gruß Jan :)



    SQL execution error, Der Spaltenname 'VOLLADRESSE' fehlt bzw. ist ungültig.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Das soll da ein Alias sein, oder? Vielleicht will Oraggle da ein 'as' sehen.
     
  6. Distrilec

    Distrilec Datenbank-Guru

    @akretschmer Hat im Prinzip schon das richtige gesagt... Das ist aber auch von deiner Version abhängig... Wenn du noch ne 8i hast wird selbst das nicht funktionieren... (Mal ganz davon abgesehen dass du dann ganz andere Probleme hättest :) )
     
  7. jan99

    jan99 Benutzer

    Moin !

    wir haben das jetzt hinbekommen und das Resultat sieht wie folgt aus:

    SELECT
    LISTAGG(LAGE2.BEZEICHNUNG ||' '|| HSNR.HAUSNUMMER, '-') within GROUP (order by LAGE2.BEZEICHNUNG ||' '|| HSNR.HAUSNUMMER) ZusammengefassteAdresse

    from AX_LAGBEZMITHNR HSNR,

    AX_LAGEBEZEICHNUNG LAGE1,

    AX_LAGBEZKATALOGEINTG LAGE2,

    AX_GEBAEUDE G

    WHERE HSNR.FID_BEZIEHTSICHAUF = G.FID

    AND LAGE1.FID = HSNR.FID_LAGEBEZEICHNUNG

    AND LAGE1.land||LAGE1.regierungsbezirk||LAGE1.kreis||LAGE1.gemeinde||LAGE1.lage = LAGE2.SCHLUESSELGESAMT

    AND G.FID = 4774647


    Gruß jan
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden