Générer dynamiquement des colonnes de tableau croisé dans PostgreSQL
Je suis en train de créer crosstab
requêtes de PostgreSQL tel qu'il génère automatiquement les crosstab
colonnes au lieu de coder en dur. J'ai écrit une fonction qui génère dynamiquement la liste des colonnes que j'ai besoin pour mon crosstab
requête. L'idée est de remplacer le résultat de cette fonction dans le crosstab
requête à l'aide de sql dynamique.
Je sais comment le faire facilement dans SQL Server, mais mon peu de connaissance de PostgreSQL est entravant ma progression ici. Je pensais stocker le résultat de la fonction qui génère la dynamique de la liste de colonnes dans une variable et l'utiliser pour générer dynamiquement la requête sql. Il serait génial si quelqu'un pouvait me guider sur le même sujet.
-- 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 ?
OriginalL'auteur invinc4u | 2012-10-14
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le C de la fonction
crosstab_hash
pour cela.Le manuel n'est pas très clair à cet égard. Il est mentionné dans les à la fin du chapitre sur
tableau croisé()
avec deux paramètres:Pour votre exemple:
Appel:
Noter que vous avez besoin de créer un autre
crosstab_hash
fonction pour chaquecrosstab
fonctionner avec un autre type de retour.Voici un autre étroitement liés réponse.
Votre de fonction pour générer la liste des colonnes est plutôt alambiqué, le résultat est incorrect (
int
manquant aprèskernel_id
), il peut être remplacé par cette requête SQL:Et il ne peut pas être utilisée de manière dynamique, de toute façon.
Le problème est que le type de retour d'une fonction ne peut pas être modifiée dynamiquement. Vous permettre de recréer la fonction elle-même de façon dynamique et ensuite l'appeler immédiatement. Mais c'est un travail délicat ...
Ya qui fait sens. Mais j'espérais qu'il existait une certaine hacky chemin à l'aide dyanmic SQL qui aurait résolu le problème. Après la préparation du SQL dynamique, nous devrions être en mesure d'exécuter la requête et il devrait générer le tableau croisé dynamique pour nous. Voir ceci par exemple : muhammedsalimp.wordpress.com/2010/07/16/.... Je suis déjà en manque mon Serveur SQL 🙁 de toute façon merci une tonne pour votre aide et vos conseils !!
OriginalL'auteur Erwin Brandstetter
@erwin-brandstetter: Le type de retour de la fonction n'est pas un problème si vous êtes toujours retourner un type JSON avec la conversion des résultats.
Ici est la fonction je suis venu avec:
Donc, lorsque vous l'exécutez, vous bénéficiez de la dynamique des résultats en JSON, et vous n'avez pas besoin de savoir combien de valeurs ont été pivoté:
Modifier: Si vous avez mélangé les types de données dans votre tableau croisé, vous pouvez ajouter une logique de le chercher pour chaque colonne avec quelque chose comme ceci:
OriginalL'auteur Caullyn
L'approche décrite ici
http://www.cureffi.org/2013/03/19/automatically-creating-pivot-table-column-names-in-postgresql/
a bien fonctionné pour moi.Au lieu de récupérer le tableau croisé dynamique directement. Le plus facile est de laisser la fonction de générer une chaîne de requête SQL. Dynamiquement exécuter la résultante de chaîne de requête SQL sur demande.
OriginalL'auteur Ben
Je sais que c'est un vieux post, mais a lutté pour un peu de temps sur la même question.
Mon Énoncé Du Problème:
J'avais un tableau avec les multiples valeurs dans un champ et je voulais créer une requête analyse croisée avec les 40+ en-têtes de colonnes par ligne.
Ma Solution a été de créer une fonction qui boucle à travers la colonne de la table pour saisir les valeurs que je voulais utiliser comme en-têtes de colonne dans la requête analyse croisée.
Au sein de cette fonction, j'ai pu alors Créer la requête analyse croisée. Dans mon cas d'utilisation, j'ai ajouté ce tableau croisé résultat dans un tableau distinct.
E. g.
OriginalL'auteur Travisty