Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 02/05/2016 12:24:47
- pljavabruno
- Membre
Soucis avec la commande CROSSTAB
Bonjour,
j'ai un souci avec ma requête crosstab,
en fait j'ai la requête suivante qui fonctionne très bien
select * from crosstab
(
'select i.matricule,i.nom || i.prenom as nom_eleve,i.sexe, m.libelle as matiere, n.valeur as note
from note n
inner join inscription a on n.idiscris = a.idiscris
inner join choixmatiere ac on a.idiscris = ac.idiscris
inner join devoir d on ac.id = d.id
inner join enseignement en on ac.id = en.id
inner join matiere m on en.id = m.id
inner join individu i on a.id = i.id
where a.id = 1
order by 2',
'select distinct libelle as matiere from matiere order by 1
'
)
as matiere
(
--select string_agg('"' || libelle || '"' || ' numeric', ', ') from note_matiere where isgpe= false
"matricule" character varying(254),"nom_eleve" character varying(254), "sexe" character varying(254),"Chimie" numeric, "Histoire" numeric, "Philosophie" numeric
);
seulement, je veux rendre la définition des colonnes dynamique, car dans mon contexte cette définition de colonne ne peut pas être figée, elle peut variée d'un élève à l'autre. Il s'agit de la partie suivante:
as matiere
(
--select string_agg('"' || libelle || '"' || ' numeric', ', ') from note_matiere where isgpe= false
"matricule" character varying(254),"nom_eleve" character varying(254), "sexe" character varying(254),"Chimie" numeric, "Histoire" numeric, "Philosophie" numeric
);
je veux qu'elle soit dynamique.
j'ai essayé de remplacer par une requête: select string_agg('"' || libelle || '"' || ' numeric', ', ') from matiere
mais rien ne marche.
Merci pour votre assistance et soutient.
Dernière modification par pljavabruno (02/05/2016 12:25:28)
Hors ligne
#2 02/05/2016 17:10:17
- dverite
- Membre
Re : Soucis avec la commande CROSSTAB
Il n'est pas possible de faire en une seule passe un pivot SQL avec des colonnes dynamiques.
Il faut faire 2 passes:
- une première requête qui récupère la liste des colonnes
- une deuxième requête dynamique, dans laquelle on injecte le résultat de la première. Cette deuxième requête peut être basée sur crosstab, ou une autre méthode, comme une suite de CASE... WHEN..THEN... END AS nomcolonne.
Ces 2 passes ne peuvent pas être factorisées dans une fonction plpgsql, car on ne pourrait pas appeler cette fonction sans déclarer explicitement les colonnes qu'elle retourne, ce qui fait revenir au problème de départ.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Pages : 1