PDA

View Full Version : SQL Listagg systemfehler



Seiten : 1 [2] 3

Fuerchau
28-05-25, 16:29
SQL erzeugt keine temporären Tabellen, also Ergebniss werden immmer bei Bedarf berechnet.
Du musst da dann leider wohl ein Script erstellen:

create newtable as (
select a, b, list_agg() as listerg
from mytable
group by a, b
) with data

Dann kannst du mit dem Ergebnis
select a, b, min(listerg)
from newTable
group by a, b

arbeiten.

B.Hauser
28-05-25, 17:36
Ich werde aus dem LISTAGG nicht schlau!
Hast Du wirklich Tag, Monat, Jahr in 3 Zeilen oder alle in der gleichen Zeile?

Wenn zweiteres der Fall wäre, ist der LISTAGG völlig überflüssig, d.h. also Min(Digits(TT) concat '.' concat Digits(MM) concat '.' concat Digits(YY) ist völlig ausreichend.

Willst Du wirklich das Minimum von einem alphanumerischen Datum im Format Tag.Monat.Jahr?

Robi
28-05-25, 17:48
Ich habe eine Kopf Datei
und detail Daten
und Stammdaten

zu einer Kopf information gehören x Detail Sätze
Diese können unterschiedliche PE (PostEingang) Daten haben.
Die stehen als tt mm jjjj in 3 verschiedenen Feldern in einem Satz
Die brauche ich alle hintereinander zu den Kopf und Stamm Daten
Die MIN funktion brauche ich weil das ganze gegroupt ist, auf Alle ausgabe Felder
Sonst lässt er das Listagg nicht zu.
Es hat nichts mit dem echten Min( ) zu tun.
das listagg kann ich auch in den group packen, selbe ergebniss

Fuerchau
28-05-25, 18:26
Das List_Agg ist doch bereits ein Aggregat und benötigt also einen Group By, nur dass die Werte dann hintereinander stehen und bei Bedarf noch sortiert werden können.
Warum willst du unbedingt einen Min?

Du kannst dann auch folgendes dann machen, wenn du nur das List_Agg des Details brauchst:

select f1, f2, liste
from header h
cross join lateral (
select list_agg(...) as liste
from details d
where h.f1 = d.f1 and h.f2 = d.f2
)

Robi
28-05-25, 18:39
Ach Baldur, das steht doch da



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 ....

Wenn ich den min weglasse ist das listagg ergebnis im select nicht gültig
Und wenn ich das listagg in den unteren Group packe, bricht er auch ab.

B.Hauser
28-05-25, 19:35
Ich habe eine Kopf Datei
und detail Daten
und Stammdaten

zu einer Kopf information gehören x Detail Sätze
Diese können unterschiedliche PE (PostEingang) Daten haben.
Die stehen als tt mm jjjj in 3 verschiedenen Feldern in einem Satz
Die brauche ich alle hintereinander zu den Kopf und Stamm Daten
Die MIN funktion brauche ich weil das ganze gegroupt ist, auf Alle ausgabe Felder
Sonst lässt er das Listagg nicht zu.
Es hat nichts mit dem echten Min( ) zu tun.
das listagg kann ich auch in den group packen, selbe ergebniss

Deshalb lass das LISTAGG einfach weg und mach nur den MIN.
LISTAGG ist eine Aggregat-Funktion, die über mehrere Zeilen verknüpft und nicht innerhalb einer Zeile (da genügt ein einfaches CONCAT)

Fuerchau
28-05-25, 20:54
Es wird ja die Liste der Werte in einer Spalte aus der Detail gewünscht sowie Informationen aus dem Kopf.
Dies ist mit meinem SQL möglich, da der Kopf mit der einen Ergebniszeile des Details als List_Agg verknüpft wird. Dazu ist kein Group By erforderlich, da der Lateral an Hand der Where-Klausel die Sätze auf die Gruppe einschränkt und daher den Group By obsolet macht.

Ich mache das inzwischen häufiger, da ich im Lateral auch durchaus mehrere Gruppenergebnisse fabrizieren kann.
Ein join lateral eröffnet da inzwischen viele Möglichkeiten, scalare Subselects komplett zu ersetzen.

Robi
30-05-25, 08:31
Nein Baldur, in deinem Bsp. fehlt die Verknüpfung imListagg zu der Kopf Datei.
Und die geht nicht, da er in deiner Version die Kopf Felder nicht kennt.
Und wenn ich den min () weglasse, bemeckert er das listagg Ergebnis, da es im group fehlt.
Wiederhole ich es im group, bricht er ab

Pikachu
30-05-25, 08:40
Wie hat man sowas nur ohne LISTAGG() gemacht? Ging das überhaupt? Seit wann gibt's LISTAGG()?

B.Hauser
30-05-25, 11:36
LISTAGG gibt es seit Release 6.1
... und vorher hat man sich seine eigene UTF geschrieben, in der man die zu verknüpfenden Sätze gelesen und den jeweils gewünschten Text hinten angehängt und das Ergebnis dann ausgegeben hat.