Anmelden

View Full Version : SQL Listagg systemfehler



Seiten : [1] 2 3

Robi
27-05-25, 13:23
Moin zusammen

mache ich ein

select F1, F2,
listagg(digits(tt) concat '.' concat
digits(mm) concat '.' concat
digits(jj) , ', ')
from datei
group by f1, f2

bekomme ich das gewünschte Ergebnis.

in einem komplexen Statement


Select a1, b1, c1,
min((select listagg(digits(tt) concat '.' concat
digits(mm) concat '.' concat
digits(jj) , ', ')
from Datei
where f1=a1 and f2=a2 group by f1, f2))
from ... (3 Dateien)
where ...(einfache Feld=Feld verknüpfung und Feld = Wert Satzauswahl)
group by (alle Felder des select
order by ....

bekomme ich einen SQL Systemfehler
auch wenn ich das min( vor dem listagg weglasse und den select in den unteren Group packe, bekomme ich einen Systemfehler
V7R5
Sql kaputt?
anders lösen?
Idee?

Danke!

Robi
27-05-25, 14:07
Ergänzung:
Lasse ich im Listagg den Group by weg, läuft das Statement aber die Listagg Funktion geht nicht (nur ein Datum).

Auch die Umstellung von

min((select listagg(digits(tt) concat '.' concat
digits(mm) concat '.' concat
digits(jj) , ', ')
from Datei
where f1=a1 and f2=a2 group by f1, f2))

auf

min((select listagg(digits(tt) concat '.' concat
digits(mm) concat '.' concat
digits(jj) , ', ') within group( order by f1, f2)
from Datei
where f1=a1 and f2=a2 ))

läuft, bringt aber nur einen Satz mit einem Datum anstatt einen Satz mit 3 oder 4 Datum

Fuerchau
27-05-25, 16:53
Du machst ja ein Aggregat über ein Aggregat. Das das nicht klappt ist klar.
Was klappen könnte wäre ein

select min(myagg) from (
select f1, f2, list_agg() as myagg
from mytable
group by f1, f2
)

Within Group dient nur der Sortierung innerhalb des List_Agg, da die Quelldaten unsortiert sein können.
Und wenn du kein Group by hast, kann list_agg auch nichts aggregieren.

Ansonsen kann list_agg auch einen CLOB generieren, der u.U. nicht aggregierbar ist, z.B. mit Min.
In diesem Fall kannst du ggf. per substring(list_agg(..) from 1 for 10000) arbeiten.

Robi
28-05-25, 09:42
select min(myagg) from (
select f1, f2, list_agg() as myagg
from mytable
group by f1, f2
)

das hatte ich auch, aber ich brauche eine Verknüpfung --> where f1=a1 and f2=a2
In deiner Version kennt er aber a1, a2 nicht

Anstatt des min( könnte ich sen select ja in den group mit hinein nehmen (hatte ich versucht)
Aber das knallt auch

noch ne idee?

Pikachu
28-05-25, 11:14
Welcher SQL-Systemfehler?

Fuerchau
28-05-25, 11:30
Mir erschließt sich die Logik für dein Min(List_agg(FX)) nicht,
Durch List_agg(fx) within group(order by fx) steht der kleinste Wert immer am Anfang der Liste.
Ein min(list_agg(fx)) wäre nur sinnvoll, wenn nicht nach f1+f2 gruppiert wird.

Robi
28-05-25, 11:43
Wenn ich da kein Min oder Max mache, bekomme ich den Fehler,
Spalte *N oder Ausdruck in select Liste nicht gültig

Da das Statement unten ja einen Group auf alle Felder des select's hat.
group by Myagg geht nicht,
Group by listagg(... bricht ab

@Pikachu
SQL0901 Systemfeler mit CPF 4204 Interner Fehler im Abfrageprozessor

Pikachu
28-05-25, 11:48
Wo kommen hier f1 und f2 her?


in einem komplexen Statement


Select a1, b1, c1,
min((select listagg(digits(tt) concat '.' concat
digits(mm) concat '.' concat
digits(jj) , ', ')
from Datei
where f1=a1 and f2=a2 group by f1, f2))
from ... (3 Dateien)
where ...(einfache Feld=Feld verknüpfung und Feld = Wert Satzauswahl)
group by (alle Felder des select
order by ....

bekomme ich einen SQL Systemfehler

Robi
28-05-25, 12:13
aus Datei
also der Datei, auf die das listagg läuft.

a1 und a2 aus einer der anderen 4 Dateien die selektiert werden

Robi
28-05-25, 13:12
Mist,
jetzt mache ich zu begin ein
With abcde as (select a1, a2, listagg(...) as PE

und danach den o.g. select , selektiere PE, verknüpfe mit abcde und groupe zusätzlich PE

und bekomme einen SQL-Systemfehler.
Wobei der 1. select, mit dem listagg(..., alleine fehlerfrei läuft.