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

PHP & Base de données Discussion :

Utiliser UNION, GROUP BY et ORDER BY [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Utiliser UNION, GROUP BY et ORDER BY
    Bonjour à tous,

    J'ai un petit problème pour utiliser ces 3 clauses en même temps.

    Pour l'instant ma requête ci-dessous fonctionne bien mais je souhaiterais organiser le résultat final afin de différencier les 2 sous-sélections qui sont pour l'instant mélangées et donc utiliser un ORDER BY mais je n'y arrive pas.
    Postgre me renvoie toujours une erreur:

    Code sql : 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
    43
    44
    45
    46
    47
    48
    49
    SELECT
      scot.libelle_scot,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00"
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      scot.code_scot
     
    UNION
     
    SELECT
      commune.libelle_commune,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00"
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      commune.libelle_commune;


    Est ce que quelqu'un aurait une idée svp?

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Comme ça?
    Code sql : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SELECT * from (
    SELECT
      scot.libelle_scot as libelle,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00",1 as selection
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      scot.code_scot
     
    UNION
     
    SELECT
      commune.libelle_commune as libelle,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00",2 as selection
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      commune.libelle_commune;) as Complet
    GROUP BY libelle,selection
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    non il y a une erreur:
    "ERREUR: erreur de syntaxe sur ou près de « ; »
    LINE 50: commune.libelle_commune; ) AS Complet"

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Ouio j'ai oublié d'enlever le ";"
    Code sql : 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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SELECT * FROM (
    SELECT
      scot.libelle_scot AS libelle,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00",1 AS selection
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      scot.code_scot
     
    UNION
     
    SELECT
      commune.libelle_commune AS libelle,
      sum(epls.logtot2010)"log_tot_10",
      sum(epls.logtot2009)"log_tot_09",
      sum(epls.logtot2008)"log_tot_08",
      sum(epls.logtot2007)"log_tot_07",
      sum(epls.logtot2006)"log_tot_06",
      sum(epls.logtot2005)"log_tot_05",
      sum(epls.logtot2004)"log_tot_04",
      sum(epls.logtot2003)"log_tot_03",
      sum(epls.logtot2002)"log_tot_02",
      sum(epls.logtot2001)"log_tot_01",
      sum(epls.logtot2000)"log_tot_00",2 AS selection
    FROM
      tables_de_references.commune,
      meddtl.epls,
      tables_de_references.scot
    WHERE
      commune.codgeo = epls.codgeo AND
      scot.code_scot = commune.scot
     
    GROUP BY
      commune.libelle_commune) AS Complet
    GROUP BY libelle,selection
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    aie...désolé, il y a toujours une erreur:

    ERREUR: la colonne « complet.log_tot_10 » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat
    LINE 1: SELECT * FROM (

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Ce que je ne comprends pas c'est que tu n'utilises pas l'ORDER BY mais un autre GROUP BY ??

    on m'a parlé d'utiliser la clause JOIN pour libéré le WHERE mais je ne vois pas du tout la construction possible.

    Toujours en voulant voir apparaitre mon libelle_commune et mon groupement par libelle.scot.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    quelles sont tes cles de tables, comment sais tu que l'information dans la table 1 correspond à des informations supplémentaires de la table 2 etc?
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    les clefs primaires de mes tables sont codgeo d'un côté et code_scot de l'autre.
    avec une clef étrangère entre scot(dans ma table commune) et code_scot dans ma table scot.


    A chaque commune dans la table commune correspond un code scot correspondant à un sous-territoire.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Cette requête ci-dessous fonctionne:

    Code sql : 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
      scot.libelle_scot,
      sum(epls.logtot2010)
    FROM
    meddtl.epls 
    JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
    JOIN tables_de_references.scot  ON commune.scot=scot.code_scot
    GROUP BY scot.code_scot
     
    UNION
     
    SELECT
      commune.libelle_commune,
      sum(epls.logtot2010)
    FROM
    meddtl.epls 
    JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
    JOIN tables_de_references.scot  ON commune.scot=scot.code_scot
    GROUP BY commune.codgeo;


    Par contre, j'aimerais classer avec ORDER BY suivant les deux parties de la requête, pour l'instant le résultat mélange tout...et en ajoutant des ORDER BY ca ne change rien...

  10. #10
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2012
    Messages : 111
    Points : 144
    Points
    144
    Par défaut
    Code sql : 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
    SELECT a,b FROM(
    SELECT
    scot.libelle_scot as a,
    sum(epls.logtot2010) as b
    FROM
    meddtl.epls
    JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
    JOIN tables_de_references.scot ON commune.scot=scot.code_scot
    GROUP BY scot.code_scot
     
    UNION
     
    SELECT
    commune.libelle_commune as a,
    sum(epls.logtot2010) as b
    FROM
    meddtl.epls
    JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
    JOIN tables_de_references.scot ON commune.scot=scot.code_scot
    GROUP BY commune.codgeo) as complet
    ORDER BY a,b
    L'art du developpement est la logique.
    Tout est possible, il suffit de chercher :p
    Si le problème est résolu
    Pense à Merci

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    C'est bon ça marche.

    merci bcp pour votre aide, je vais étudier de ça de plus près.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/10/2013, 12h09
  2. Réponses: 8
    Dernier message: 12/03/2012, 09h38
  3. [SQL] Jointure,Group BY et ORDER BY COUNT qui marche pas
    Par Stef784ever dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/08/2005, 12h28
  4. PB de vue utilisant UNION avec ENTERPRISE MANAGER
    Par punglas dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/12/2004, 15h18
  5. [XSD] Utilisation de groupes de balises xhtml
    Par Kehel dans le forum Valider
    Réponses: 7
    Dernier message: 30/01/2004, 09h55

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