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 :

Problème requête SQL.


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Problème requête SQL.
    Bonjour,

    Désolé de ne pas avoir donné de titre plus précis, mais je ne trouvais vraiment pas.

    Commençons par le shéma de ma table.

    Table 'marche'
    -------------------------
    Champ -- Valeur 1er enregsitrement -- Valeur deuxième enregistrement
    id -- 1 -- 2
    objet -- 1 -- 1
    prix -- 5 -- 4
    nombre -- 3 -- 5

    C'est donc une table qui liste toutes les ventes actuelles sur un marché. Le champ objet correspond à l'ID de l'objet, pour que je puisse grouper toutes les ventes d'un même objet dans ma requête. Je veux récupérer le nombre total de vente d'un même objet, le prix le plus bas pour cet objet, et le nombre d'objet au prix le plus bas.

    J'ai donc fait cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(marche.nombre) AS nbtotal, MIN(marche.prix) AS prixmini
    FROM marche
    GROUP BY marche.objet
    Comme vous pouvez le voir, je plante pour récupérer le nombre d'objet au prix le plus bas. Ce qui se résumerait par 'marche.nombre WHERE MIN(marche.prix)'. La réponse doit être toute simple mais je bloque.

    Merci d'avance pour votre aide !

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Regarde vers les clauses du type HAVING tu devrais trouver ta solution.

    Cordialement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 206
    Points : 62
    Points
    62
    Par défaut
    requête imbriquée

    Si j'ai bien saisi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(marche.nombre) AS nbtotal, MIN(marche.prix) AS prixmini
    FROM marche
    HAVING marche.prix = SELECT min(marche.prix) FROM marche
    GROUP BY marche.objet
    J'espère que c'est bon et que j'ai pas trop rouillé ^^

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    La Clause HAVING se place après le GROUP BY car elle porte sur la restriction de groupes et non de lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT SUM(marche.nombre) AS nbtotal
             , MIN(marche.prix) AS prixmini
     
    FROM marche
     
    GROUP BY marche.objet
     
    HAVING marche.prix = 
                                 (SELECT min(marche.prix) 
                                   FROM marche)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci pour vos réponses,

    Bien trouvé mais il y a un problème (ce qui est de ma faute d'ailleurs car j'ai oublié de le préciser) : cela ne prends pas en compte le fait qu'il y est différentes sortes d'objets.

    Je m'explique :
    Reprenons les enregistrements du premier post :
    Champ -- Valeur 1er enregsitrement -- Valeur deuxième enregistrement
    id -- 1 -- 2
    objet -- 1 -- 1
    prix -- 5 -- 4
    nombre -- 3 -- 5

    Imaginons que nous rajoutons encore deux autres enregistrements :
    Champ -- Valeur 1er enregsitrement -- Valeur deuxième enregistrement
    id -- 3 -- 4
    objet -- 2 -- 2
    prix -- 10 -- 9
    nombre -- 3 -- 5

    Le champ objet correspond donc à l'ID d'un objet (par exemple ici l'ID 1 pourrait correspondre à du bois et le 2 à de la pierre). Si j'effectue la requête, la deuxième ligne, contenant toutes les informations sur la pierre, ne sera pas créer. Je crois comprendre que cela viens du fait que c'est le prix le plus petit de toute la table qui est utilisé (pour trouver le prix le plus bas d'un objet), au lieu du prix minimal de l'objet (quand on fait :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    HAVING marche.prix = (SELECT min(marche.prix) FROM marche)
    )

    Merci d'avance

  6. #6
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Vous ne devez pas faire une selection min sur un subselect dans votre clause HAVING, cela n'a aucun sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT objet,SUM(nombre) AS nbtotal, MIN(prix) AS prixmini
    FROM marche
    GROUP BY objet
    HAVING prixmini =  MIN(prix)
    devrait vous donner le resultat attendu

    Bon courage

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Malheureusement ça ne marche toujours pas. Ce n'est pas grave je vais enlever cette partie mais si la réponse saute aux yeux de quelqu'un je suis preneur.

    Merci de votre aide !

  8. #8
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,


    l'ID 1 pourrait correspondre à du bois et le 2 à de la pierre).
    Donc il te faut l'ID de l'objet dans ta requête !

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 109
    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 109
    Points : 28 437
    Points
    28 437
    Par défaut
    En décomposant le problème :
    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
    SELECT  m3.objet
        ,   m3.nbtotal
        ,   m3.prixmini
        ,   m4.nbmini
    FROM    (   SELECT  m1.objet    AS objet
                    ,   MIN(m1.prix)    AS prixmini
                    ,   SUM(m1.nombre)  AS nbtotal
                FROM    marche  AS m1
                GROUP BY m1.objet
            )   AS m3
        INNER JOIN
            (   SELECT  m2.objet    AS objet
                    ,   m2.prix     AS prixmini
                    ,   SUM(m2.nombre) AS nbmini
                FROM    marche  AS m2
                GROUP BY m2.objet
                    ,   m2.prix
            )   AS m4
            ON  m3.objet    = m4.objet
            AND m3.prixmini = m4.prixmini
    ;

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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