View Full Version : SQL Listagg systemfehler
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!
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
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.
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?
Welcher SQL-Systemfehler?
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.
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
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
aus Datei
also der Datei, auf die das listagg läuft.
a1 und a2 aus einer der anderen 4 Dateien die selektiert werden
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.