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

Schreibe einen Kommentar