[Oracle] SQL: Fehler in Select mit Xmlagg

keewee279

Grünschnabel
Hallo,

ich bin Oracle-Anfänger und hoffe, hier kann mir jemand weiterhelfen.

Ich habe eine Abfrage bei der ich für Spalte 1 (p.S_ID) teilweise mehrere Einträge, d.h. Zeilen erhalte.
Diese Einträge möchte ich nun so zusammenfassen, dass in Spalte 1 jeder Eintrag nur einmal vorkommt und in Spalte 2 die Einträge entsprechend aggregiert (verknüpft) werden.

Die Funktion Listagg kann ich nicht verwenden, da ich hier teilweise das Zeichenlimit von Oracle überschreite.
Die Funktion Xmlagg ist genau das Richtige für meinen Fall, nur wende ich sie offenbar falsch an und erhalte folgenden Fehler:
SQL:
"ORA-00937: not a single-group group function"

Kann mir jemand sagen, wie ich mein Select hier bzw. den Xmlagg-Teil richtig schreiben muss ?

Mein Query (gekürzt):
SQL:
ALTER SESSION ENABLE PARALLEL QUERY;
SELECT
   p.S_ID AS ID
   , XMLELEMENT
   (
       "AINs", XMLAGG
       (
           XMLELEMENT
           (
               "AIN", i.AIN ||
               '-nl-Article: ' || SUBSTR(a.AIN_NAME, 1, 50) || '...' ||
               '-nl-Quantity: ' || SUM(i.UNITS) ||
               '-nl-Price: ' || TO_CHAR(i.PRICE, 'FM9,990.00') || ' + ' || TO_CHAR(i.PRICE_TAX, 'FM9,990.00') || ' USt = ' || TO_CHAR((i.PRICE + i.PRICE_TAX), 'FM9,990.00') ||
               '-nl------' ||
               '-nl-Subtotal: ' || TO_CHAR((i.PRICE * SUM(i.UNITS)), 'FM9,990.00') || ' + ' || TO_CHAR((i.PRICE_TAX * SUM(i.UNITS)), 'FM9,990.00') || ' USt = ' || TO_CHAR(((i.PRICE + i.PRICE_TAX) * SUM(i.UNITS)), 'FM9,990.00')
           )
       )
   )/*.EXTRACT('//text()')*/ AS Details
FROM
   ITEMS i
LEFT JOIN
   AINS a
   ON i.AIN = a.AIN
LEFT JOIN
   PKGS p
   ON i.SHIPMENT = p.SHIPMENT
WHERE
   /*...*/
GROUP BY
   p.S_ID
   , i.AIN
   , a.AIN_NAME
   , i.UNITS
   , i.PRICE
   , i.PRICE_TAX
ORDER BY
   p.S_ID

Vielen Dank im Voraus.

VG,
Martin
 
Ich kenne XMLELEMENT und XMLAGG nicht. Aber der Fehlermeldung nach, ist XMLELEMENT keine Gruppierungsfunktion.
Dein Feld ist ja so aufgbaut XMLELEMENT(XMLAGG(XMLELEMENT))

Entweder nimmst du die Gruppierung aus dieser Stufe raus und machst ein übergeordnetes Select in dem du auch nach dem Resultat deiner XML-Berechnung gruppierst, oder du musst es anderst lösen.
 
Moin keewee279,

wie Yaslaw schon schrieb - du aggregierst irgendwie einmal zu viel in dem zusammengestöpselten XMLELEMENT(XMLAGG(XMLELEMENT)).

Mit XMLAGG(XMLELEMENT) hast du schon alles, was du brauchst,


SQL:
SELECT
   p.S_ID AS ID,
  XMLAGG (
               XMLELEMENT           ( <bla>)
         )  as Details

FROM ...
JOIN....
...
GROUP BY..

Wenn dir "Details" nur als "XMLTYPE" und nicht als der gewünschte String angezeigt wird, dann musst du es eben als Varchar(4000) o.ä. casten.
SQL:
SELECT
   p.S_ID AS ID,
  cast( XMLAGG (
               XMLELEMENT           ( <bla>)
         ) as Varchar(4000))  as Details

FROM ...

Grüße
Biber
 

Neue Beiträge

Zurück