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

Requêtes PostgreSQL Discussion :

Ligne doublée dans résultat d'une requête


Sujet :

Requêtes 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 Ligne doublée dans résultat d'une requête
    Bonjour,
    Je réalise la requête suivante:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    SELECT rr.intitule AS Nom_Site
    ,rr.idsite
      ,cr.libelle AS Groupe_site
      ,CASE WHEN r2013.cptcred LIKE '7%' THEN 'X'
      ELSE NULL
      END AS "2013"
      ,CASE WHEN r2014.cptcred LIKE '7%' THEN 'X'
      ELSE NULL
      END AS "2014"
      ,CASE WHEN r2015.cptcred LIKE '7%' THEN 'X'
      ELSE NULL
      END AS "2015"
      ,CASE WHEN r2016.cptcred LIKE '7%' THEN 'X'
      ELSE NULL
      END AS "2016"
      ,CASE WHEN r2017.cptcred LIKE '7%' THEN 'X'
      ELSE NULL
      END AS "2017"
       ,CASE	WHEN r2013.cptcred LIKE '7%' THEN 'X'
    		WHEN r2014.cptcred LIKE '7%' THEN 'X'
    		WHEN r2015.cptcred LIKE '7%' THEN 'X'
    		WHEN r2016.cptcred LIKE '7%' THEN 'X'
    		WHEN r2017.cptcred LIKE '7%' THEN 'X'
    		ELSE NULL
      END AS "RECETTES"
    FROM l.rsite rr
      LEFT JOIN l.asso_cat_site acr
       ON rr.idsite = acr.idsite
        LEFT JOIN l.cat_site cr
         ON acr.id_cat_site = cr.id
      LEFT JOIN l.r2013mou r2013
       ON rr.idsite = r2013.idg_site AND r2013.cptcred LIKE '7%'
      LEFT JOIN l.r2014mou r2014
       ON rr.idsite = r2014.idg_site AND r2014.cptcred LIKE '7%'
      LEFT JOIN l.r2015mou r2015
       ON rr.idsite = r2015.idg_site AND r2015.cptcred LIKE '7%'
      LEFT JOIN l.r2016mou r2016
       ON rr.idsite = r2016.idg_site AND r2016.cptcred LIKE '7%'
      LEFT JOIN l.r2017mou r2017
       ON rr.idsite = r2017.idg_site AND r2017.cptcred LIKE '7%'
    GROUP BY rr.intitule,rr.idsite, cr.libelle, r2013.cptcred, r2014.cptcred, r2015.cptcred, r2016.cptcred, r2017.cptcred
    ORDER BY cr.libelle, rr.intitule
    J'obtiens bien un résultat mais certaines lignes apparaissent plusieurs fois. Pourquoi?

    Cordialement,
    Vandman

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 135
    Par défaut
    Il y a certainement des différences entre les lignes qui te semblent apparaître plusieurs fois dans le résultat de la requête.
    Essaye en utilisant les mêmes colonnes dans la clause ORDER BY que dans le GROUP BY, ces différences devraient être plus faciles à identifier.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Je pense que vous souhaitez réaliser un pivot, Il faut donc aggréger les case :
    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
    27
    28
    29
    30
    31
    32
    SELECT rr.intitule AS Nom_Site
         , rr.idsite
         , cr.libelle AS Groupe_site
         , max(CASE WHEN r2013.cptcred LIKE '7%' THEN 'X' ELSE NULL END) AS "2013"
         , max(CASE WHEN r2014.cptcred LIKE '7%' THEN 'X' ELSE NULL END) AS "2014"
         , max(CASE WHEN r2015.cptcred LIKE '7%' THEN 'X' ELSE NULL END) AS "2015"
         , max(CASE WHEN r2016.cptcred LIKE '7%' THEN 'X' ELSE NULL END) AS "2016"
         , max(CASE WHEN r2017.cptcred LIKE '7%' THEN 'X' ELSE NULL END) AS "2017"
         , max(CASE	WHEN r2013.cptcred LIKE '7%' THEN 'X'
                    WHEN r2014.cptcred LIKE '7%' THEN 'X'
    		WHEN r2015.cptcred LIKE '7%' THEN 'X'
    		WHEN r2016.cptcred LIKE '7%' THEN 'X'
    		WHEN r2017.cptcred LIKE '7%' THEN 'X'
    		ELSE NULL
                END) AS "RECETTES"
      FROM l.rsite rr
      LEFT JOIN l.asso_cat_site acr
        ON rr.idsite = acr.idsite
      LEFT JOIN l.cat_site cr
        ON acr.id_cat_site = cr.id
      LEFT JOIN l.r2013mou r2013
        ON rr.idsite = r2013.idg_site AND r2013.cptcred LIKE '7%'
      LEFT JOIN l.r2014mou r2014
        ON rr.idsite = r2014.idg_site AND r2014.cptcred LIKE '7%'
      LEFT JOIN l.r2015mou r2015
        ON rr.idsite = r2015.idg_site AND r2015.cptcred LIKE '7%'
      LEFT JOIN l.r2016mou r2016
        ON rr.idsite = r2016.idg_site AND r2016.cptcred LIKE '7%'
      LEFT JOIN l.r2017mou r2017
        ON rr.idsite = r2017.idg_site AND r2017.cptcred LIKE '7%'
     GROUP BY rr.intitule,rr.idsite, cr.libelle
     ORDER BY cr.libelle, rr.intitule

  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
    Bonjour,

    Oui, c'est bien un pivot que je veux faire. Il semble que ca fonctionne bien. Cependant, ca prend vraiment beaucoup de temps.
    Y-a-t-il un moyen d'optimiser l'exécution de la requette?

    Cordialement,
    Vandman

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 9
    Par défaut
    En vitesse : il y a peut-être quelque chose à voir de la fonction crosstab (cf https://www.postgresql.org/docs/9.1/...tablefunc.html, chap F.41.1.2., et l'exemple).

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par vandman Voir le message
    Bonjour,

    Oui, c'est bien un pivot que je veux faire. Il semble que ca fonctionne bien. Cependant, ca prend vraiment beaucoup de temps.
    Y-a-t-il un moyen d'optimiser l'exécution de la requette?

    Cordialement,
    Vandman
    PIVOT est une fonction cosmétique qui n'a pas sa place sur un SGBDR. Ce genre de "truc" a été rajouté à la demande (imbécile) des utilisateurs dans différents SGBDR.... Comme un SGBDR n'est pas fait pour faire de la cosmétique (il n'est ni conçu ni optimisé pour cela) ça prendra toujours beaucoup de temps et il n'y a aucun moyen d'optimiser cela !

    Solution : faire cela avec des outils de présentation spécialisés : :
    • Excel
    • PowerPivot
    • ...


    ou une base de données décisionnelle ;
    • SSAS de Microsoft
    • TerraData
    • ...

    Qui disposent à la fois de langages spécialisés pour ce faire (exemple langage MDX) et d'outils de présentation.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    PIVOT est une fonction cosmétique qui n'a pas sa place sur un SGBDR. Ce genre de "truc" a été rajouté à la demande (imbécile) des utilisateurs dans différents SGBDR..
    Ouais, sans doute les mêmes que ceux qui ont imposé ORDER BY : tiens, encore un ordre purement cosmétique alors qu'il est serait si simple de claquer deux semaines et 20 k€ à monter un ETL, un datawarehouse, du SSIS/SSAS, et de mettre en danger sa santé mentale à apprendre le MDX pour trier.

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 9
    Par défaut
    Citation Envoyé par vandman Voir le message
    Bonjour,
    Oui, c'est bien un pivot que je veux faire. Il semble que ca fonctionne bien. Cependant, ca prend vraiment beaucoup de temps.
    Y-a-t-il un moyen d'optimiser l'exécution de la requette?
    Ce qui prend du temps ce sont très probablement les jointures externes, pas les MAX.

    Tout est correctement indexé ?
    Peut-être ajouter un index partiel sur " r2013mou (idg_site) WHERE cptcred LIKE '7%' " ? s'il est vraiment discriminant ?
    Voire sur "(idg_site,cptcred) WHERE cptcred LIKE '7%' " en espérant se limiter à lire l'index.

    Si le problème est encore d'actualité, vous pouvez copier-coller le plan d'exécution (EXPLAIN (ANALYZE,VERBOSE,BUFFERS) SELECT... ) sur https://explain.depesz.com/ et poster le lien ici, ainsi que le résultat de \d+ pour chaque table impliquée.

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Que donne ceci ?

    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
    27
    28
    29
     
    SELECT rr.intitule AS Nom_Site
         , rr.idsite
         , cr.libelle AS Groupe_site
         , max(CASE WHEN Annee = 2013 THEN 'X' ELSE NULL END) AS "2013"
         , max(CASE WHEN Annee = 2014 THEN 'X' ELSE NULL END) AS "2014"
         , max(CASE WHEN Annee = 2015 THEN 'X' ELSE NULL END) AS "2015"
         , max(CASE WHEN Annee = 2016 THEN 'X' ELSE NULL END) AS "2016"
         , max(CASE WHEN Annee = 2017 THEN 'X' ELSE NULL END) AS "2017"
         , max(CASE	WHEN Annee IS NOT NULL THEN 'X' ELSE NULL     END) AS "RECETTES"
      FROM l.rsite rr
      LEFT JOIN l.asso_cat_site acr
        ON rr.idsite = acr.idsite
      LEFT JOIN l.cat_site cr
        ON acr.id_cat_site = cr.id
      LEFT JOIN (
    	SELECT idg_site, 2013 as Annee FROM l.r2013mou  WHERE cptcred LIKE '7%'
        UNION 
    	SELECT idg_site, 2014 FROM l.r2014mou  WHERE cptcred LIKE '7%'
    	UNION 	
    	SELECT idg_site, 2015 FROM l.r2015mou  WHERE cptcred LIKE '7%'
    	UNION 	
    	SELECT idg_site, 2016 FROM l.r2016mou  WHERE cptcred LIKE '7%'
    	UNION 	
    	SELECT idg_site, 2017 FROM l.r2017mou  WHERE cptcred LIKE '7%'
    	) r
    	ON rr.idsite = r.idg_site
     GROUP BY rr.intitule,rr.idsite, cr.libelle
     ORDER BY cr.libelle, rr.intitule
    Effectivement, la question des index disponibles se pose...

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

Discussions similaires

  1. Calcul ligne par ligne sur le résultat d'une requête
    Par CanardJM dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/04/2008, 13h06
  2. générer des n° de lignes dans le résultat d'une requête
    Par karimspace dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/09/2007, 20h33
  3. Enregistrer le résultat d'une requête dans un fichier Excel
    Par Isa31 dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/05/2005, 14h31
  4. Résultat d'une requête dans une variable...
    Par Hoegaarden dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/04/2004, 13h51

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