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 29/04/2020 14:18:54

Abdel
Membre

Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

Bonjour à tous,

Je veux transformer mon tableau simple en tableau croisé dynamique, mais en remplissant les valeurs par du txt et non par une valeur numérique.

j'ai utilisé cette commande : SELECT
  idlocal,
  (CASE WHEN  ntile = 1 THEN ddenom END) "Nom proprietaire 1",
(CASE WHEN  ntile = 2 THEN ddenom END) "Nom proprietaire 2",
(CASE WHEN  ntile = 3 THEN ddenom END) "Nom proprietaire 3",
(CASE WHEN  ntile = 4 THEN ddenom END) "Nom proprietaire 4",
(CASE WHEN  ntile = 5 THEN ddenom END) "Nom proprietaire 5",
(CASE WHEN  ntile = 6 THEN ddenom END) "Nom proprietaire 6"
  FROM analyse_complete_test

mais j'arrive pas à regrouper mes résultats même en passant par un "group by.". y'a t'il une solution s'il vous plait ?

Hors ligne

#2 29/04/2020 15:01:54

rjuju
Administrateur

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

Quelle est l'erreur exacte ?

Hors ligne

#3 29/04/2020 15:07:24

Abdel
Membre

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

Au fait je n'ai pas  d'erreur, mais j'obtiens pas le résultat souhaité. le résultat de la commande fait que si par exemple un local possède 3 propriétaires, il va dupliquer les lignes 3 fois alors que je veux obtenir qu'une seule ligne.

Hors ligne

#4 29/04/2020 15:41:47

rjuju
Administrateur

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

C'est justement le principe du GROUP BY.  Si vous pouvez avoir 3 propriétaires et que dans ce cas vous ne voulez qu'une ligne c'est que par définition il ne faut pas regrouper par propriétaire mais par autre chose, et là comme il s'agit de vos données vous seul pouvez savoir quel critère de regroupement choisir à priori.

Hors ligne

#5 29/04/2020 16:05:13

Abdel
Membre

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

j'ai déjà grouper local "Group by" et ça fonctionne pas.

Voici mon code : SELECT
  idlocal,
  (CASE WHEN  ntile = 1 THEN ddenom END) "Nom proprietaire 1",
(CASE WHEN  ntile = 2 THEN ddenom END) "Nom proprietaire 2",
(CASE WHEN  ntile = 3 THEN ddenom END) "Nom proprietaire 3",
(CASE WHEN  ntile = 4 THEN ddenom END) "Nom proprietaire 4",
(CASE WHEN  ntile = 5 THEN ddenom END) "Nom proprietaire 5",
(CASE WHEN  ntile = 6 THEN ddenom END) "Nom proprietaire 6"
  FROM analyse_complete_test
group by idlocal,ntile,ddenom

Le SGBD me force à grouper même par ntile et ddenom
ntile : c'est le nombre de colonne pour chaque propriétaire.

Hors ligne

#6 30/04/2020 13:31:20

dverite
Membre

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

Le résultat voulu est un idlocal dans la colonne de gauche, sans répétition d'une ligne à l'autre, et sur chaque ligne  à droite de idlocal 6 colonnes avec les propriétaires correspondants.
Pour ça il faut grouper uniquement par idlocal et utiliser une fonction d'aggrégat pour générer les résultats des 6 colonnes.


C'est ça qui n'est pas intuitivement évident dans les requêtes qui font des tableaux croisés. Bien que logiquement il y ait un seul "ddenom" possible pour un couple (idlocal, ntile) donné, le moteur SQL n'en sait rien. La solution est d'utiliser un aggrégat comme MAX(ddenom). Le max d'une liste d'une seule valeur étant cette valeur, ça convient très bien.

Dans l'idée ce modèle de requête doit marcher (voir la version éditée avec FILTER)

SELECT
  idlocal,
  max(ddenom) FILTER (where ntile = 1) "Nom proprietaire 1",
  max(ddenom) FILTER (where ntile = 2) "Nom proprietaire 2",
... etc pour les autres valeurs...
FROM analyse_complete_test
GROUP BY idlocal;

Dernière modification par dverite (30/04/2020 13:43:51)

Hors ligne

#7 30/04/2020 13:53:34

Abdel
Membre

Re : Création d'un tableau analyse croisée avec des valeurs de type "TEXT"

Merci pour votre réponse.
je viens de tester et ça fonctionne.
Merci @dverite pour votre contribution.

Hors ligne

Pied de page des forums