Vous n'êtes pas identifié(e).
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
Quelle est l'erreur exacte ?
Julien.
https://rjuju.github.io/
Hors ligne
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
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.
Julien.
https://rjuju.github.io/
Hors ligne
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
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)
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Merci pour votre réponse.
je viens de tester et ça fonctionne.
Merci @dverite pour votre contribution.
Hors ligne