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

MySQL Discussion :

Question sur UNION et GROUP BY


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 66
    Points : 33
    Points
    33
    Par défaut Question sur UNION et GROUP BY
    Bonjour la communauté;

    Voilà j'ai une question : si ces deux expressions sont équivalentes ? La première affiche la moyenne des ventes par catégorie et par année et la deuxième fait l'union de deux agrégations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.category, t.year AVG(purchase_price) average_sales
    FROM product p, time t, purchases f
    Where p.prod_id = f.prod_id
    And t.time_key = f.time_key
    GROUP BY p.category, t.year ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT p.category, t.year AVG(purchase_price) average_sales
    FROM product p, time t, purchases f
    Where p.prod_id = f.prod_id
    And t.time_key = f.time_key
    GROUP BY p.category
    union
    SELECT p.category, t.year AVG(purchase_price) average_sales
    FROM product p, time t, purchases f
    Where p.prod_id = f.prod_id
    And t.time_key = f.time_key
    GROUP BY t.year

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis plus de 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Il manque une virgule après t.year dans les deux requêtes qui sont donc fausses !

    3) "year" est un mauvais nom de colonne car c'est un mot réservé du langage SQL.

    4) La seconde requête est encore plus fausse parce que toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    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 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

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

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

    Il manque une virgule dans votre SELECT, juste après t.year...
    De plus, les jointures ne s'écrivent plus en séparant les tables par des virgules depuis plus de 20 ans (préférez la syntaxe INNER JOIN... ON...).

    Enfin, oubliez définitivement votre deuxième requête : seul MySQL autorise un tel GROUP BY, avec autant de permissivité, et c'est bien dommage parce que ça donne des requêtes catastrophiques.
    Restez sur la première requête...

    [EDIT] : arf, grillé en vitesse de frappe ! Mais le moins qu'on puisse dire, c'est qu'on est d'accord !
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Petite question sur la fonction GROUP BY et consort
    Par gutsblack dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 13/08/2014, 11h19
  2. Question sur union-set
    Par pierrotlenageur dans le forum SL & STL
    Réponses: 1
    Dernier message: 04/11/2008, 15h20
  3. [MySQL 4.0] Question sur GROUP BY
    Par Fabouney dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/09/2006, 19h45
  4. [MySQL] Question sur les GROUP BY
    Par Coladin dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2006, 14h25
  5. PB avec group by sur union
    Par panini182 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2005, 17h58

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