Du kannst in pl/pgSQL nicht die Spaltennamen durch iterieren, das sieht die Sprache leider immer noch nicht vor.
Es gibt ein paar sehr krude Workarounds, aber die beinhalten ein paar weitere C-Module - und dann kann man auch gleich eine andere Sprache nehmen.
Es gibt eine Tabelle (mit dynamischen Anzahl und Namen von Spalten).
(Die Namen und Anzahl kann man aus den Metadaten der Datenbank auslesen)
Man muss diese Tabelle auslesen, Datensätze gruppieren und diese Daten in andere dynamische Tabelle mit gleicher Struktur speichern.
Auslesen und gruppieren ist einfach und funktioniert
DECLARE
columns RECORD;
sql_select text;
BEGIN
-- SQL Query erstellen: SELECT avg(...) AS ..., avg(...) AS ..., avg(...) AS ... FROM tabele GROP BY kundennummer;
-- Beispiel: SELECT avg(bilanz) AS bilanz, avg(anzahl) AS anzahl, avg(punkte) AS punkte FROM tabele GROP BY kundennummer;
sql_select := 'SELECT ';
FOR columns IN SELECT column_name FROM informations_schema.columns WHERE table_name = tablename LOOP
sql_select := sql_select || 'avg(' || columns.column_name || ') AS ' || columns.column_name ' ,';
END LOOP;
sql_select := sql_select || 'FROM table GROUP BY kundennummer';
(PROBLEM) hier brauche ich eine INSERT query mit den Daten aus oberem SELECT
Ansatz wäre:
DECLARE
data RECORD;
BEGIN
-- SQL Query erstellen: INSERT INTO tabele (..., ..., ...) VALUES (..., ..., ...);
-- Beispiel: INSERT INTO (bilanz, anzahl, punkte) VALUES (10, 20, 30);
sql_insert := 'INSERT INTO tabele ';
FOR data IN EXECUTE(sql_select) LOOP
-- HIER PROBLEM (wie komme ich an die Werte der SELECT ? data."columns.column_name" geht ja leider nicht
END LOOP;
PS:
Vorgehen wie
INSERT INTO table VALUES data,
also einfügen als komplettes RECORD geht nicht,
da ich dazwischen noch einige Berechnungen machen muss.
oben in der FOR schleife ausgeben lasse bekomme ich folgende Ausgabe:
z.B. je nach Tabelle:
(384,383.619995117188,1,4,1,1)
Das heisst ich komme an die Werte von dem Record doch ?
Ohne die Spalten zu kennen. Dann müsste man einfach die Klammer trimmen
und dann nach Komma Split machen.
Ist zwar riesen Hack und ich werde es so nicht machen. Aber nur als Überlegung…