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 :

bete requete de tri


Sujet :

Langage SQL

  1. #1
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut bete requete de tri
    bonjour
    j'ai une table livraison (idliv, idproduit, dateliv, prix)
    clé primaire sur id.

    je voudrais récupérer le prix d'un idproduit à une date précisée.
    simple:
    select prix
    from livraison
    where idproduit=12345 and to_days(dateliv)=to_days('2006-01-02')

    le truc, c'est que si ya pa eu de livraison a la date precisée, il faut que ma requete me donne le prix de la derniere date de livraison, et la je bloque

    la requete

    select prix
    from livraison
    where idproduit=12345 and to_days(dateliv)<=to_days('2006-01-02')

    me renvoie un ensemble de resultat, mais il m'en faut qu'un seul, et placer un "limit 1" n'ameliorera pas la rapidité d'execution de ma requete.

    Une idée?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select prix
    from   livraison T1
    WHERE  idproduit = 12345
    AND    dateliv = (SELECT MAX(dateliv)
                      FROM   livraison T2
                      WHERE  T2.idproduit = T1.idproduit 
                        AND  dateliv <= CAST('20060102' AS DATE))
    Au passage TO_DATE n'existe pas en SQL. De plus faire un TO_DATE sur une colonne dateliv dont je suppose qu'elle est déjà de type DATE relève de la bétise !

    A +

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 105
    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 105
    Points : 28 397
    Points
    28 397
    Par défaut
    Aussi simple que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   l.prix
    FROM     livraison   AS l
    WHERE    l.idproduit = 12345 
       AND   l.dateliv = 
                (  SELECT   MAX(m.date_liv)
                   FROM     livraison   AS m
                   WHERE    m.dateliv   <= CAST('2006-01-02' AS DATE)
                      AND   l.idproduit = m.idproduit
                )
    ;

  4. #4
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    suprenante requetes!!
    elles se ressemblent beaucoup, malheureusement la requete met enormement de temps a s'executer.

    de plus, ce que j'ai besoin de faire est un peu plus complexe!
    en fait, il faudrait que j'applique cette requete a une liste de produit.

    mais je suis content que vous avez bien saisi ma demande.

    un petit truc encore, j'ai dans ma table des champs dont le prix est 0 donc, il faudrait aussi que je n'en tienne pas compte.

    j'ai trouver un truc comme ca sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  idproduit, prix 
    FROM    livraison
    WHERE   idproduit=11703 AND
            dateliv=
            (SELECT  max(dateliv) 
             FROM    livraison 
             WHERE   idproduit=11703 AND
                     to_days(dateliv)<=to_days('2006-07-17') AND
                     prix>0)
            AND prix>0
    c'est deja plus rapide, mais j'arrive pas a voir comment je peux mettre une liste de produit a la place d'un seul (mis a part dans une boucle php)

    desolé pour le to_days(), c'est une fonction mysql

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 105
    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 105
    Points : 28 397
    Points
    28 397
    Par défaut
    Citation Envoyé par keil
    suprenante requetes!!
    elles se ressemblent beaucoup, malheureusement la requete met enormement de temps a s'executer.
    Normal qu'elles se ressemblent, il n'y a pas beaucoup de méthodes pour obtenir le même résultat...
    Citation Envoyé par keil
    de plus, ce que j'ai besoin de faire est un peu plus complexe!
    en fait, il faudrait que j'applique cette requete a une liste de produit.
    Il suffit de modifier la sélection sur l'identifiant produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT   l.prix
    FROM     livraison   AS l
    WHERE    l.idproduit IN (12345, 123456, ...)
       AND   l.prix > 0 
       AND   l.dateliv = 
                (  SELECT   MAX(m.date_liv)
                   FROM     livraison   AS m
                   WHERE    m.dateliv   <= CAST('2006-01-02' AS DATE)
                      AND   l.idproduit = m.idproduit
                      AND   m.prix > 0
                )
    ;

  6. #6
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    nickel!
    merci beaucoup

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

Discussions similaires

  1. Requete de tri
    Par maxoulefou dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/02/2007, 22h55
  2. Requete COUNT + tri
    Par TraxX dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/06/2006, 22h40
  3. Requete de tri par mois
    Par Jay45 dans le forum Access
    Réponses: 1
    Dernier message: 03/04/2006, 13h57
  4. requete et tri dans etats
    Par flo456 dans le forum IHM
    Réponses: 3
    Dernier message: 22/12/2005, 11h02
  5. requete avec tri sur date erronée
    Par olivll dans le forum Access
    Réponses: 11
    Dernier message: 20/10/2005, 15h45

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