IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Créer une requête « PIVOT » en PostgreSQL.


Sujet :

PostgreSQL

  1. #1
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 720
    Points : 2 393
    Points
    2 393
    Par défaut Créer une requête « PIVOT » en PostgreSQL.
    Bonjour.

    On m'a demandé de créer une table monitoring qui va afficher des informations provenant d'autres tables.
    À un moment, je dois utiliser le contenu d'une des tables en tant que nom de colonne, donc je devrais utiliser un PIVOT.

    Ci-dessous un exemple plus parlant et ce à quoi je voudrais arriver.

    Table produits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +------------+--------+--------+
    | id_produit | nom_fr | nom_en |
    +------------+--------+--------+
    |          0 | pomme  | apple  |
    +------------+--------+--------+
    |          1 | pêche  | peach  |
    +------------+--------+--------+
    |          2 | poire  | pear   |
    +------------+--------+--------+
    |          3 | abricot| apricot|
    +------------+--------+--------+
    Table achats
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    +------------+-----------+------------+----------+
    | date       | id_client | id_produit | quantité |
    +------------+-----------+------------+----------+
    | 2000-01-01 |        A0 |          0 |        3 |
    +------------+-----------+------------+----------+
    | 2000-01-02 |        A0 |          0 |        2 |
    +------------+-----------+------------+----------+
    | 2000-01-03 |        A0 |          0 |        5 |
    +------------+-----------+------------+----------+
    | 2000-01-03 |        A0 |          2 |        2 |
    +------------+-----------+------------+----------+
    | 2000-01-03 |        A0 |          0 |        1 |
    +------------+-----------+------------+----------+
    | 2000-01-04 |        A0 |          0 |        2 |
    +------------+-----------+------------+----------+
    | 2000-01-04 |        A0 |          2 |        3 |
    +------------+-----------+------------+----------+
    Résultat voulu
    Fourni dans la requête : id_client et langue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +------------+---------+---------+---------+---------+
    | date       | pomme   | pêche   | poire   | abricot |
    +------------+---------+---------+---------+---------+
    | 2000-01-01 |       3 |       0 |       0 |       0 |
    +------------+---------+---------+---------+---------+
    | 2000-01-02 |       2 |       0 |       0 |       0 |
    +------------+---------+---------+---------+---------+
    | 2000-01-03 |       6 |       0 |       2 |       0 |
    +------------+---------+---------+---------+---------+
    | 2000-01-04 |       2 |       0 |       3 |       0 |
    +------------+---------+---------+---------+---------+
    Je dois bien avouer que j'ai jamais fait de pivot, je suis un peu perdu.
    Le peu d'exemples que j'ai trouvé en ligne impose de mettre le nom des colonnes "en dur" dans la requête.
    Or, ceux-ci peuvent varier, en nombre ou selon la langue.
    Est-ce qu'il est possible de mettre dynamiquement les noms des produits et de faire le pivot, le tout en une seule requête ?
    Merci (et bonnes fêtes ).

    Cordialement.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 048
    Points : 23 810
    Points
    23 810
    Par défaut
    Bonjour,

    Normalement, ce n'est pas le rôle du SGBD de mettre en forme le résultat de la requête, mais celui d'un langage support comme PHP.
    Toutefois, une piste possible consiste à regarder du côté du module complémentaire tablefunc, et notamment la fonction crosstab : http://postgresql.developpez.com/doc...tion/francais/

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 720
    Points : 2 393
    Points
    2 393
    Par défaut
    Bonjour.

    Le problème avec crosstab, c'est qu'il faut renseigner manuellement les nom des colonnes qui seront affichées. Or j'aimerais que ces noms soient dynamiques.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Points : 18 395
    Points
    18 395
    Par défaut
    Ce n'est pas possible car SQL est un langage déclaratif.
    Il faut passer par une couche de PL/pgSQL qui générera les noms de colonnes d'après une première requête sur la table.

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 720
    Points : 2 393
    Points
    2 393
    Par défaut
    C'est bien ce qu'il me semblait.

    Bon finalement je vais partir sur une solution bricolée, où je fabrique une requête SQL avec le résultat d'une autre requête précédente.

    Sur ce, je vous souhaite de joyeuses fêtes !

  6. #6
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par Waldar Voir le message
    Ce n'est pas possible car SQL est un langage déclaratif...
    Ce n'est pas parce que SQL est déclaratif que cela est impossible. D'autres sgbd (notamment access et sqlserver) le font en natif. Que dire alors de la récursivité?
    Je pense que c'est au développeurs de pgsql de l'implémanter en natif.
    Pour le moment la seule solution consiste à le faire sur le client.
    @+

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Points : 18 395
    Points
    18 395
    Par défaut
    SQL-Server renseigne les noms des colonnes pivotées dynamiquement ?
    Si c'est le cas c'est une nouveauté.

  8. #8
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Citation Envoyé par Waldar Voir le message
    SQL-Server renseigne les noms des colonnes pivotées dynamiquement ?
    Si c'est le cas c'est une nouveauté.
    Je viens de m'apercevoir que c'est effectivement non. Une conclusion trop hâtive de ma part.
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer une requête Pivot sous BOXi.
    Par holevilain dans le forum Débuter
    Réponses: 5
    Dernier message: 11/10/2012, 11h01
  2. Créer une requête statistiques
    Par MARCO63 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 28/01/2008, 23h47
  3. Réponses: 31
    Dernier message: 24/08/2006, 13h13
  4. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 17h04
  5. [HTTP]Créer une requête http multipart/related
    Par jothi35 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 05/04/2005, 16h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo