Sto cercando di creare query crosstab
in PostgreSQL in modo che generi automaticamente le colonne crosstab
invece di codificarle. Ho scritto una funzione che genera dinamicamente l'elenco di colonne di cui ho bisogno per la mia query crosstab
. L'idea è di sostituire il risultato di questa funzione nella query crosstab
utilizzando sql dinamico.Genera dinamicamente colonne per campi incrociati in PostgreSQL
So come farlo facilmente in SQL Server, ma la mia conoscenza limitata di PostgreSQL sta ostacolando i miei progressi qui. Stavo pensando di memorizzare il risultato della funzione che genera l'elenco dinamico di colonne in una variabile e di utilizzarlo per creare dinamicamente la query sql. Sarebbe bello se qualcuno potesse guidarmi riguardo lo stesso.
-- 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 ?
Grazie per la risposta dettagliata @Erwin. Sono stato in grado di eseguire il campo incrociato di base con un set statico di campi incrociati. Sono sorpreso che non abbiamo alcun modo di generare dinamicamente l'elenco di colonne e quindi una tabella a campi incrociati dinamica in postgresql. C'è qualche altro modo per aggirare questo post di Postgresql di cui sei a conoscenza? – invinc4u
@ invinc4u: il problema è che il tipo di ritorno di una funzione non può essere modificato dinamicamente. È possibile ricreare la funzione stessa in modo dinamico e quindi chiamarla immediatamente. Ma è un affare complicato ... –
Ya ha senso. Ma speravo che esistesse un modo hacky usando dyanmic SQL che avrebbe risolto il problema. Dopo aver preparato l'SQL dinamico, dovremmo essere in grado di eseguire la query e generare il campo incrociato dinamico per noi. Vedi questo ad esempio: http://muhammedsalimp.wordpress.com/2010/07/16/dynamic-cross-tab-query-in-sql-server/. Mi manca già il mio SQL Server :(Comunque grazie a una tonnellata per il tuo aiuto e guida !! – invinc4u