Dynamisch generieren und die Spalten für die Kreuztabelle in PostgreSQL
Ich versuche zu erstellen crosstab
Anfragen in PostgreSQL solche, die es erzeugt automatisch die crosstab
Spalten statt hardcoding. Ich habe geschrieben eine Funktion, die dynamisch generiert die Liste der Spalte, die ich für meine crosstab
Abfrage. Die Idee ist, zu ersetzen, die dem Ergebnis dieser Funktion in der crosstab
Abfrage mithilfe von dynamischen sql.
Ich weiß, wie ich dies leicht tun, die in SQL Server, aber meine begrenzten Kenntnisse von PostgreSQL ist behindert meine Fortschritte hier. Ich dachte, die speichern das Ergebnis der Funktion generiert das dynamische Liste von Spalten in eine variable verwenden, um dynamisch erstellen Sie die sql-Abfrage. Es wäre toll, wenn jemand könnte mich zu diesem Thema.
-- Table which has be pivoted
CREATE TABLE test_db
(
kernel_id int,
key int,
value int
);
INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);
-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
key_id int;
text_op TEXT = '' kernel_id int, '';
BEGIN
FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP
text_op := text_op || key_id || '' int , '' ;
END LOOP;
text_op := text_op || '' DUMMY text'';
RETURN text_op;
END;
' LANGUAGE 'plpgsql';
-- This query works. I just need to convert the static list
-- of crosstab columns to be generated dynamically.
SELECT * FROM
crosstab
(
'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2',
'SELECT DISTINCT key FROM test_db ORDER BY 1'
)
AS x (kernel_id int, key1 int, key2 int, key3 int); -- How can I replace ..
-- .. this static list with a dynamically generated list of columns ?
InformationsquelleAutor invinc4u | 2012-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die mitgelieferte C-Funktion
crosstab_hash
.Das Handbuch ist nicht sehr klar in dieser Hinsicht. Es ist erwähnt am Ende der Kapitel
Kreuztabelle()
mit zwei Parametern:Für dein Beispiel:
Nennen:
Beachten Sie, dass Sie benötigen, um eine deutliche
crosstab_hash
- Funktion für jedencrosstab
Funktion mit einem anderen return-Typ.Hier ist eine weitere eng Verwandte beantworten.
Ihre Funktion zum generieren der Liste der Spalte ist eher kompliziert, das Ergebnis ist falsch (
int
fehlen nachkernel_id
), kann es ersetzt werden mit der SQL-Abfrage:Und es kann nicht verwendet werden, dynamisch sowieso.
Das problem ist, dass der Rückgabetyp einer Funktion kann nicht geändert werden, dynamisch. Sie könnte neu die Funktion sich dynamisch an, und rufen Sie es sofort. Aber das ist eine heikle Sache ...
Ya das macht Sinn. Aber ich hoffte, dass es, dass es einige hacky Weise mit dyanmic SQL würde das problem gelöst haben. Nach der Vorbereitung der dynamischen SQL, wir sollten einfach in der Lage sein, um die Abfrage auszuführen und es sollte generieren die dynamischen Kreuztabelle für uns. Siehe dieses Beispiel : muhammedsalimp.wordpress.com/2010/07/16/.... Ich bin schon fehlt mein SQL-Server 🙁 Egal, Dank eine tonne für Ihre Hilfe und Anleitung !!
InformationsquelleAutor Erwin Brandstetter
@erwin-brandstetter: der Rückgabetyp Der Funktion ist kein Problem, wenn Sie immer auf die Rückgabe eines JSON-Typs mit der konvertierten Ergebnisse.
Hier ist die Funktion, die ich kam mit:
So, wenn Sie es ausführen, erhalten Sie die dynamischen Ergebnisse im JSON-Format, und Sie brauchen nicht zu wissen, wie viele Werte wurden geschwenkt:
Bearbeiten: Wenn Sie über gemischte Datentypen in Ihrer Kreuztabelle aus, die Sie hinzufügen können, die Logik zu suchen, die für jede Spalte mit etwas wie dieses:
InformationsquelleAutor Caullyn
Hier beschriebenen Ansatz
http://www.cureffi.org/2013/03/19/automatically-creating-pivot-table-column-names-in-postgresql/
gut für mich gearbeitet.Anstatt das abrufen der pivot-Tabelle direkt. Der einfachere Ansatz ist, lassen Sie die Funktion generiert eine SQL-query-string. Dynamisch führen Sie die resultierende SQL-Abfrage-string auf Nachfrage.
InformationsquelleAutor Ben
Merke ich, dies ist ein älterer post, aber gekämpft, für eine kleine Weile auf das gleiche Problem.
Mein Problem Erklärung:
Ich hatte einen Tisch mit muliple Werte in einem Feld und wollte eine Kreuztabellenabfrage erstellen, die mit 40+ Spalte-überschriften pro Zeile.
Meine Lösung war die Erstellung einer Funktion, die das Durchlaufen der Tabelle Spalte zu packen, die Werte, die ich verwenden wollte als Spaltenüberschriften in der Kreuztabelle Abfrage.
In dieser Funktion könnte ich dann Erstellen Sie die Kreuztabellenabfrage. In meinem Anwendungsfall habe ich Hinzugefügt dieser Kreuztabelle Ergebnis in einer separaten Tabelle.
E. g.
InformationsquelleAutor Travisty