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 MySQL Discussion :

Totalisation sur group by inexpliquée


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Totalisation sur group by inexpliquée
    Bonjour,

    Le résultat de ma requête n'est pas conforme à ce que j'attends.

    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
    SELECT libelle,
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 12
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS 'Mois 1' ,
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 11
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS 'Mois 2' ,
    ...
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 1
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS 'Mois 12'
    FROM `maj_pub_log`
    LEFT OUTER JOIN t_pub_doc ON maj_pub_log.id_pub_doc = t_pub_doc.id_pub_doc
    WHERE t_pub_doc.id_trt
    BETWEEN 1
    AND 4
    GROUP BY libelle
    ORDER BY libelle
    Le cumul se fait sur un seul mois.

    Si je change

    GROUP BY libelle
    Par

    GROUP BY libelle, SUBSTRING( doc_date_emission, 1, 7 )
    Et j'ai bien un cumul par mois.

    Je ne vois pas ou se trouve mon erreur.

    Merci d'avance

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    J'avoue que je suis surpris que cette requête ne renvoie pas d'erreur...
    Tu fais appel à doc_date_emission sans qu'elle apparaisse dans le GROUP BY. Manifestement, ça passe, mais c'est probablement pour ça que ton résultat n'est pas celui attendu.


    Si tu modifies les clauses du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 12
    MONTH ) , 1, 7 )
    THEN count( t_pub_doc.id_pub_doc )
    ELSE 0
    END AS 'Mois 1'
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    count(
    CASE
    WHEN SUBSTRING( doc_date_emission, 1, 7 ) = SUBSTRING( DATE_SUB( CURDATE( ) , INTERVAL 12
    MONTH ) , 1, 7 )
    THEN t_pub_doc.id_pub_doc
    ELSE null
    END
    ) AS 'Mois 1'
    ça ne fonctionne pas mieux (et tu gardes le GROUP BY libelle) ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Par défaut
    Mettre des colonnes dans le SELECT qui ne sont pas dans le GROUP BY est accepté depuis certaines versions de MySql, sauf que leur contenu seras indéfini car il prend le premier qu'il rencontre.

    Sinon je comprend pas trop ce que tu souhaite, tu dis :
    Si je change Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY libelle, SUBSTRING( doc_date_emission, 1, 7 )
    Et j'ai bien un cumul par mois.
    Si c'est ca que tu souhaite, tu as donc la solution

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Citation Envoyé par Eric93
    Mettre des colonnes dans le SELECT qui ne sont pas dans le GROUP BY est accepté depuis certaines versions de MySql
    Je note l'info. Je travaille essentiellement sur Oracle 9.2, et je pense que cette requête ne passerait pas (mais je n'ai pas fait le test).
    Quoi qu'il en soit, c'est étrange d'autorisé ces requêtes si le résultat est indéfini, non ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Par défaut
    Je sais pas trop à quoi ca peux servir, ya surement une raison, quoiqu'il en soit ca répond pas à la norme SQL

  6. #6
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Citation Envoyé par Eric93 Voir le message
    Je sais pas trop à quoi ca peux servir, ya surement une raison, quoiqu'il en soit ca répond pas à la norme SQL
    Disons que c'est une facilité d'écriture. On groupe couramment sur une clef primaire tout en retournant plusieurs champs de la table. Dans ce cas il est pénible de devoir lister 27 colonnes dans le "GROUP BY" alors que la présence de la clef primaire garantie la constance des valeurs. D'un autre côté quand on n'est pas prévenu (ou en cas d'oubli) ça donne des résultats... intéressants

    Bref dans ce cas effectivement les valeurs devraient être utilisées dans des fonctions d'agrégation comme COUNT (cf suggestion de marchand_de_sable) ou en jouant sur un SUM.

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

Discussions similaires

  1. Aide sur Group by , sum et count
    Par rippoz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/06/2007, 14h48
  2. [MySQL 4.0] Question sur GROUP BY
    Par Fabouney dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/09/2006, 19h45
  3. [Access 2000] Evénement click sur groupe d'option
    Par Mariboo dans le forum Access
    Réponses: 1
    Dernier message: 22/09/2006, 14h52
  4. [C.R .8.5] doublons de référence sur groupes différents
    Par leuke dans le forum SAP Crystal Reports
    Réponses: 24
    Dernier message: 14/11/2005, 11h15
  5. ordre correct sur group ?
    Par Force59 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 02/04/2004, 09h27

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