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 :

Aide: présentation du résultat d'une requête [9.1]


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut Aide: présentation du résultat d'une requête
    Bonjour,

    Je cherche à présenter le résultat de ma requête sous une forme concaténée:

    1=> code, nom, groupe, pc1, pc2, pc3, pc4, pc5.

    Le seul hic est que je n'arrive pas à forcer le résultat dans cette présentation.
    Je l'ai plutôt naturellement comme ceci :

    2=> code, non, groupe, pc.
    aa, libelle de aa, groupe1, pc1
    bb, libelle de bb, groupe1, pc2
    ...

    Comment faire pour que 2 se présente comme 1 ?

    Voici mon humble requête :
    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
    SELECT DISTINCT
      A.code                                                                AS CODE, 
      A.intitule_code                                                       AS NOM,
      B.libelle                                                             AS GROUPE, 
      CASE  WHEN E.id = 1		THEN '1' Else '0' END   AS "PC1",
      CASE  WHEN E.id = 2          	THEN '1' Else '0' END   AS "PC2",
      CASE  WHEN E.id = 3          	THEN '1' Else '0' END   AS "PC3",
      CASE  WHEN E.id = 4       	THEN '1' Else '0' END   AS "PC4",
      CASE  WHEN E.id = 5		THEN '1' Else '0' END   AS "PC5"
    FROM 
      base.code_1 AS A
            LEFT JOIN base.asso_code_1_sc AS C
                    ON A.id_code = C.id_code AND A.id_groupe = C.id_groupe
                            LEFT JOIN base.plancpt_lib AS E
                                    ON C.id_plan = E.id
            LEFT JOIN base.groupes_codes_adm AS B
                    ON A.id_groupe = B.id AND B.id = C.id_groupe;
    Merci.

  2. #2
    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
    Par défaut
    Vous n'êtes pas très loin, l'opération que vous chercher à faire est un PIVOT.
    Il y a des fonctions natives postgresql (type crosstab), ou la solution SQL compatible multi-SGBD que vous avez initié.
    Cherchez sur le forum dans Langage SQL par exemple, il y a de nombreux exemples.

  3. #3
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Bonjour,

    Il semble que le module tablefunc ne soit pas installé et donc je ne peux pas utiliser CROSSTAB.

    Comment je fais ?

    Je suis sous debian wheezy.

    PS: En lançant le code suivant :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT * FROM CROSSTAB(
    	'SELECT DISTINCT ON (CODE,GROUPE)
    	A.code, 
    	A.intitule_code,
    	B.libelle,
    	E. intitule
    	FROM
    	base.code_1 AS A
    		LEFT JOIN base.groupes_codes_adm AS B
    			ON A.id_groupe = B.id AND B.id = C.id_groupe
    		LEFT JOIN base.asso_code_1_sc AS C
    			ON A.id_code = C.id_code AND A.id_groupe = C.id_groupe AND A.id_code =1
    			LEFT JOIN base.plancpt_lib AS E
                                    ON C.id_plan = E.id'
    )
     AS
     (
    	CODE character varying(200),
    	INTITULE character varying(200),
    	GROUPE character varying(100),
    	"PC1" character varying(50),
    	"PC2" character varying(50),
    	"PC3" character varying(50),
    	"PC4" character varying(50),
    	"PC5" character varying(50)
    );
    j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ERREUR:  la fonction crosstab(unknown) n'existe pas
    LINE 1:   SELECT * FROM CROSSTAB(
                            ^
    HINT:  Aucune fonction ne correspond au nom donné et aux types d'arguments.
    Vous devez ajouter des conversions explicites de type.
     
    ********** Erreur **********
     
    ERREUR: la fonction crosstab(unknown) n'existe pas
    État SQL :42883
    Astuce : Aucune fonction ne correspond au nom donné et aux types d'arguments.
    Vous devez ajouter des conversions explicites de type.
    Caractère : 17
    J'en profite aussi pour savoir si quelqu'un peut me valider la modification de mon code qui utilise CROSSTAB ?

    Cordialement,
    vandman

  4. #4
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Je viens de trouver la réponse:

    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
    18
    19
    SELECT DISTINCT ON (CODE,GROUPE)
      A.code                                                     AS CODE, 
      A.intitule_code                                            AS NOM,
      B.libelle                                                  AS GROUPE, 
      SUM(CASE  WHEN E.id = 1		THEN 1 Else 0 END)   AS "PC1",
      SUM(CASE  WHEN E.id = 2          	THEN 1 Else 0 END)   AS "PC2",
      SUM(CASE  WHEN E.id = 3          	THEN 1 Else 0 END)   AS "PC3",
      SUM(CASE  WHEN E.id = 4       	THEN 1 Else 0 END)   AS "PC4",
      SUM(CASE  WHEN E.id = 5		THEN 1 Else 0 END)   AS "PC5"
    FROM 
      base.code_1 AS A
            LEFT JOIN base.asso_code_1_sc AS C
                    ON A.id_code = C.id_code AND A.id_groupe = C.id_groupe
                            LEFT JOIN base.plancpt_lib AS E
                                    ON C.id_plan = E.id
            LEFT JOIN base.groupes_codes_adm AS B
                    ON A.id_groupe = B.id AND B.id = C.id_groupe
    GROUP BY 1,2,3
    ORDER BY 1;
    L'erreur que j'ai commise est que dans ma table d'association, c.id_code existe n fois pour un plan donné. De plus j’essayais d'agréger du texte, ce qui est difficile en soit.
    Merci tout de même pour l'aide car je continue à progresser.
    Cordialement,
    vandman

  5. #5
    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
    Par défaut
    Votre DISTINCT ON ici est inutile, cette opération étant déjà réalisée par la clause GROUP BY.
    Attention également au GROUP BY 1,2,3 qui est permis par PostgreSQL et MySQL, mais ce n'est pas dans la norme SQL et ça ne fonctionne pas sur Oracle ou SQL-Server.
    Préférez un simple copier / coller !
    Pas de soucis pour la clause ORDER BY par contre.

  6. #6
    Membre éclairé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Par défaut
    Merci Waldar,

    J'ai corrigé le code pour être au plus près du standard.

    Cordialement

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

Discussions similaires

  1. [Débutant] [Aide]Afficher le résultat d'une requête sql
    Par AirStyle dans le forum C#
    Réponses: 2
    Dernier message: 06/06/2014, 09h52
  2. Réponses: 2
    Dernier message: 24/11/2012, 13h51
  3. Trier les résultats d'une requête à l'aide d'un listbox
    Par magoo33 dans le forum Coldfusion
    Réponses: 2
    Dernier message: 17/11/2008, 22h27
  4. Réponses: 4
    Dernier message: 20/03/2008, 17h23
  5. Réponses: 1
    Dernier message: 17/06/2007, 10h10

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