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

Langage SQL Discussion :

Valeurs pour une ligne répondant à critère après groupage


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut Valeurs pour une ligne répondant à critère après groupage
    Bonjour à tous !

    J'aimerais créer une requête, mais celle-ci me bloque quelque peu =\

    J'ai 2 tables :

    t_produit
    Nom_produit
    Quantité

    t_commandes
    Nom_produit
    Quantité_commandée
    Date_darrivée

    J'aimerais donc créer une requête qui m'affiche tout mes produit et leur quantité, ainsi que la quantité à arrivée et la date d'arrivée de CE produit.
    Sachant que il peut avoir plusieurs commande pour ce produit donc prendre la plus petite date d'arrivée et la quantité de la commande pour le produit.

    J'ai déjà ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t_produits.nom_produit, t_produits.Quantité, t_commandes.Quantité_commandée, t_commandes.Date_de_livraison
    FROM t_produits 
    INNER JOIN t_commandes 
    ON t_produits.nom_produit = t_commandes.nom_produit;
    Mais il m'affiche toute les commandes, j'aimerais donc qu'il ne m'affiche que la plus récente de chaque produit !

    Merci de vos réponses

  2. #2
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Utiliser MIN() avec donc GROUP BY devrait suffire.

    Voici une autre solution :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t_produit.Nom_produit, Quantité, Quantité_commandée, minDate
    FROM t_produit
        JOIN (
            SELECT Nom_produit, Quantité_commandée, MIN(Date_darrivée) AS minDate
            FROM t_commandes
            GROUP BY Nom_produit
        ) AS
            USING(Nom_produit)

  3. #3
    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
    Un grand classique... pour lequel la réponse a déjà été donnée de nombreuses fois dans les pages de ce forum
    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
    SELECT  prd.nom_produit
        ,   prd.Quantité
        ,   cmd.Quantité_commandée
        ,   cmd.Date_de_livraison
    FROM    t_produits  AS prd 
      INNER JOIN 
            t_commandes AS cmd 
            ON  prd.nom_produit = cmd.nom_produit
    WHERE   EXISTS
            (   SELECT  1
                FROM    t_commandes AS lst
                WHERE   lst.nom_produit = cmd.nom_produit
                HAVING  MIN(lst.Date_de_livraison)  = cmd.Date_de_livraison
            )
    ;
    La solution proposée par Oishiiii fonctionnera uniquement avec un SGBD qui ne respecte pas la syntaxe normalisée de la clause GROUP BY (tel que MySql)
    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.

  4. #4
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Merci pour cette requête al1_24.

    Je n'ai personellement pas lu les documents décrivants la norme SQL 1999 ou 2003 (ils sont payant je crois).

    Mais que pensez-vous de ce qu'il est écris ici ? :
    http://cedric-duprez.developpez.com/...r-group-by/#L7

    [....]
    Ce qu'il est important de retenir ici, c'est que les 2 versions qui succédèrent à la norme de 1992 ne requièrent plus explicitement que toutes les colonnes non agrégées dans la liste du SELECT soient présentes dans la clause GROUP BY.
    [....]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    Aaah merci =) j'avais pas vu ça comme ça !

    Et si je souhaites incorporé maintenant une autre close "cmd.date_de_reception IS NULL" (ce qui veut dire que ce n'est pas encore recu), je la rajoute où ?
    Bien sur, date_de_reception est un champs de t_commande.
    En gros, on s'occupe pas des commande déjà reçues.

  6. #6
    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
    Si (nom_produit, Date_de_livraison) permet de garantir l'unicité de la ligne dans t_commandes, la restriction sur date_de_reception pourra être placée uniquement dans la sous-requête associée à EXISTS. Sinon, il faudra placer la restriction à la fois sur la sous-requête et sur la requête principale.
    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.

  7. #7
    Membre émérite Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Par défaut
    Citation Envoyé par Oishiiii Voir le message
    [....]
    Ce qu'il est important de retenir ici, c'est que les 2 versions qui succédèrent à la norme de 1992 ne requièrent plus explicitement que toutes les colonnes non agrégées dans la liste du SELECT soient présentes dans la clause GROUP BY.
    [....]
    Bonjour,

    Couper la citation à ce niveau là sous-entend qu'on peut faire ce qu'on veut entre la liste des colonnes du SELECT et celle du GROUP BY, ce qui est faux :

    A la place, il faut que toute colonne non agrégée qui apparaît dans la liste du SELECT soit fonctionnellement dépendante de la clause GROUP BY.
    Enfin, si vous désirez lire la norme SQL 2003 (assez indigeste), vous pouvez vous en procurer un brouillon gratuitement ici :
    http://www.wiscorp.com/sql_2003_standard.zip

    Cordialement,

    Arkhena

  8. #8
    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
    Bonjour Oishiiii,
    Je suis totalement d'accord avec Arkhena.
    J'étais fermement opposé aux choix de mysql jusqu'à ce que je lise l'article de ced il y a quelques mois (et quel dévelopeur db serait réfractaire aux problèmes de perf?)
    Donc, j'ai mis un peu d'eau dans mon vin, et effectivement cette syntaxe valable uniquement sur mysql a un intérêt, uniquement sur mysql.

    MAIS définitivement cette syntaxe n'est pas à mettre entre toute les mains, et comme mysql est le SGBD le plus utilisé par les débutants, je continue à croire que mysql a fait un mauvais choix en s'éloignant de la norme sur un sujet aussi important que le GROUP BY.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/02/2015, 10h54
  2. [vb excel]Tester une valeur dans une ligne
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/09/2005, 13h58
  3. Regroupement de valeur pour une date
    Par Erakis dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2005, 21h00
  4. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 09h34
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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