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 :

Selectionner le moins cher


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 9
    Points : 11
    Points
    11
    Par défaut Selectionner le moins cher
    Salut,

    J'ai besoin d'aide, je n'arrive pas a comprendre.

    Je vous presente d'abord les tables
    fournisseurs(codfour,raisoc,...);
    article(codarti,designation,...);
    propositions(noprop,#codfour,#codarti,#clecat,puht,coef,...);


    Je voudrais lister pour chaque article d'une clecat, le fournisseur le moin chere de la table proposition.

    J'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select p.codarti,f.codfour,f.raisoc,min(puht/coef) as prixmoy
    from fournisseurs f
         join proposition p on f.codfour=p.codfour
    where codclecat="ma cle"
    group by p.codarti
    La réponse obtenue semble bonne, sauf qu'en regardant de plus prêt, le couple fournisseur prix n'est pas le bon.

    Je m'explique j'ai bien le prix moyen le plus faible mais le fournisseur retourné n'est pas le bon.

    Exemple
    Table Prop
    noprop|codfour|codarti|clecat|puht|coef
    123|f32|a15|cc2|100|10
    456|f50|a15|cc2|100|5

    Je devrais avoir en retour cette ligne :
    a15|f32|nom du four f32|10

    La j'ai
    a15|f50|nom du four f50|10

    Qu'est ce que je n'aurais pas vu ou pas fait, j'avoue avoir du mal à comprendre.

    SGBDR : MySQL

    Merci

  2. #2
    Membre averti
    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
    Points : 382
    Points
    382
    Par défaut
    C'est à cause du GROUP BY :

    Dans les précédente version de SQL on ne pouvais pas préciser des colonnes dans le SELECT (ici codfour et raisoc) qui n'étaient pas dans le GROUP BY, depuis certaines version, c'est accepté, mais leur valeur seras le premier qu'il rencontrera, donc indeterminé.

    Faut que tu fasse autrement, je cherche la bonne requête
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  3. #3
    Membre averti
    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
    Points : 382
    Points
    382
    Par défaut
    Je pensais avoir trouvé une solution : utiliser une sous-requête (recherche du prix minimum par article) dans la clause FROM, cette sous requête serais de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (SELECT p.codarti,min(puht/coef) AS prixmoy
    FROM proposition
    WHERE codclecat="ma cle"
    GROUP BY p.codarti) AS prixmin
    Cette sous-requete est alors considérée comme une table (prixmin), et ensuite une jointure avec proposition pour récupérer le code fournisseur et une jointure avec fournisseur pour récupérer la raison sociale.

    Le premier problème, c'est que pour la jointure avec proposition il faut utiliser le code article mais aussi le prix calculé du style a.primoy = b.puht/b.coef, je ne sais pas si cette syntaxe est accepté

    Le deuxième problème c'est que dans la doc j'ai vu
    Actuellement, les sous-requêtes en clause FROM ne peuvent pas être corrélées.
    Est ce que ca veux dire qu'on ne peux pas faire de jointure ? Je ne sais pas trop.

    Bref pas si simple ton problème, interessant néanmoins, peut-être que les cador de SQL vont trouver une solution simple
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Citation Envoyé par Eric93 Voir le message
    Dans les précédente version de SQL on ne pouvais pas préciser des colonnes dans le SELECT (ici codfour et raisoc) qui n'étaient pas dans le GROUP BY, depuis certaines version, c'est accepté, mais leur valeur seras le premier qu'il rencontrera, donc indeterminé.
    Ce n'est toujours pas accepté dans SQL, seulement par mySQL... qui n'est pas le SGBD qui se rapproche le plus de la norme.
    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.

  5. #5
    Membre averti
    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
    Points : 382
    Points
    382
    Par défaut
    OK, mais ca répond pas à sa question, j'ai pourtant cherché hier, pas trouvé de requête adapté, pas si simple.
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quelque chose comme ça :
    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
    SELECT  p.codarti
        ,   f.codfour
        ,   f.raisoc
        ,   (p.puht / p.coef) AS prixmoy
    FROM    fournisseurs    AS f
        INNER JOIN
            proposition     AS pmin
            ON  f.codfour = p.codfour
    WHERE   EXISTS  
            (   SELECT  1
                FROM    proposition AS pmin
                WHERE   p.codfour = pmin.codfour
                    AND p.codarti = pmin.codarti
                GROUP BY pmin.codfour
                    ,   pmin.codarti
                HAVING  (p.puht / p.coef) = MIN(pmin.puht / pmin.coef)
            )
    ;
    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 averti
    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
    Points : 382
    Points
    382
    Par défaut
    Interessant, je testerait ca ce soir, comme quoi c'etait pas si évident.

    Bien vu si ca marche, t'as du gambergé un peu j'imagine
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    C'est un grand classique
    En cherchant un peu sur le forum, tu trouveras de nombreuses requêtes sur le même modèle...
    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.

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

Discussions similaires

  1. trouver les 10 montants moins chers
    Par bassiste dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2009, 01h08
  2. [Requête] Tarif le moins cher..
    Par larod241 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/06/2008, 10h55
  3. [FAI] Fournisseur D'accés Internet le moins cher
    Par alavoler dans le forum Internet
    Réponses: 1
    Dernier message: 01/02/2008, 12h26

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