PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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.

Hors ligne

Pied de page des forums