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 :

Sous-requête sur une date


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut Sous-requête sur une date
    Bonjour,
    Je dois éditer des Bons de sortie magasin (BSM).
    A chaque item de BSM correspond une référence (magasin,article,nature) les articles étant stockés par lot.
    Pour un item de BSM, donc une référence, il peut y avoir plusieurs lots.
    Je veux ecrire une requête qui ne me ramène que le numéro du lot dont la date d'entrée en stock est la plus ancienne. Jai donc mis dans la clause where, une sous-requête à cet effet, mais je n'arrive pas à la faire fonctionner correctement.
    Lorsque je lance la requête principale sans la sous-requête, j'obtiens plusieurs lots par item de BSM.
    Si j'ajoute la sous-requête, je n'ai plus qu'un item de BSM : celui dont l'un des lots a la date la plus ancienne pour l'ensemble des des items/lots concernés.
    Je n'arrive pas à comprendre pourquoi la sous-requête s'applique globalement plutôt que pour chacun des items extrait lorsqu'elle n'est pas présente.
    Voici l'ordre sql en question :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    select 	e_bsm.NUMBSM,	
    	substr(e_bsm.NUMBSM,13,8) ICEBSM,	
    	e_bsm_item.ITMBSM,	
    	e_bsm_item.CODMAG,	
    	e_bsm_item.CODART,	
    	e_bsm_item.NATURE,	
    	e_lot.NUMLOT,	
    	e_lot.ITMLOT,
    	e_lot.DATPERP,
    	e_lot.DATSTO	
    from 	e_bsm
    	left outer join e_bsm_item
    		on e_bsm_item.COCENT = e_bsm.COCENT
    		and e_bsm_item.COETAB = e_bsm.COETAB
    		and e_bsm_item.NUMBSM = e_bsm.NUMBSM
    		and e_bsm_item.QTEDEM - e_bsm_item.QTEMANQ > 0
    		left outer join e_lot
    			on  e_lot.COCENT = e_bsm_item.COCENT
    			and e_lot.COETAB = e_bsm_item.COETAB
    			and e_lot.CODART = e_bsm_item.CODART
    			and e_lot.CODMAG = e_bsm_item.CODMAG
    			and e_lot.NATURE = e_bsm_item.NATURE
    where 	e_bsm.COCENT = '110' 
    and 	e_bsm.COETAB = '001'
    and 	e_bsm.NUMBSM = '0806002600010001'
    and 	e_lot.QTEDISPO > 0
    and     e_lot.DATSTO = ( select distinct min(e_lot.DATSTO)
                                     from e_lot
                                     where e_lot.COCENT = e_bsm_item.COCENT
                                      and  e_lot.COETAB = e_bsm_item.COETAB
                                      and  e_lot.CODART = e_bsm_item.CODART
                                      and  e_lot.CODMAG = e_bsm_item.CODMAG
                                      and  e_lot.NATURE = e_bsm_item.NATURE )
    order by e_bsm_item.ITMBSM,e_bsm_item.CODMAG
    Quelqu'un peut-il m'expliquer ce qu'il se passe, svp ?

    En vous remerciant,

  2. #2
    Membre actif
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Points : 217
    Points
    217
    Par défaut
    Bonjour,
    Et si tu changes ta sous requete par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT min(e_lot.DATSTO)
                                     FROM e_lot2
                                     WHERE e_lot2.COCENT = e_lot.COCENT
                                      AND  e_lot2.COETAB = e_lot.COETAB
                                      AND  e_lot2.CODART = e_lot.CODART
                                      AND  e_lot2.CODMAG = e_lot.CODMAG
                                      AND  e_lot2.NATURE = e_lot.NATURE
    Est-ce mieux ? (car tu as 2 fois le même nom)

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    Pas sûr qu'un DISTINCT MIN(...) soit plus utile !
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par ElbeDD Voir le message
    Bonjour,
    Et si tu changes ta sous requete par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT min(e_lot.DATSTO)
                                     FROM e_lot2
                                     WHERE e_lot2.COCENT = e_lot.COCENT
                                      AND  e_lot2.COETAB = e_lot.COETAB
                                      AND  e_lot2.CODART = e_lot.CODART
                                      AND  e_lot2.CODMAG = e_lot.CODMAG
                                      AND  e_lot2.NATURE = e_lot.NATURE
    Est-ce mieux ? (car tu as 2 fois le même nom)
    J'y avais songé, mais le résultat a été le même.

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par buchs Voir le message
    Bonjour,

    Pas sûr qu'un DISTINCT MIN(...) soit plus utile !

    Que veux-tu dire ? Que le DISTINTC est en trop ?

    Je l'ai mis pour que la sous-requête ne renvoie qu'une ligne dans le cas ou plusieurs lots aurait la même date minimum.
    J'ai fait l'essai avec une sous-requête multi-lignes, sans le DISTINCT et le résultat était toujours pareil.
    En fait, on dirait qu'il n'est pas tenu compte de la clause where de la sous-requête.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Excusez-le !!

    C'est une erreur bête et fonctionnelle !!

    Dans la requête principale, il y a une condition pour sélectionner les lots encore en stock.
    Et ben,,, fallait mettre la même dans la sous-requête, sinon elle allait me chercher la date du plus ancien lot encore enregistré.

    Désolé .. et merci tout de même à ceux qui ont pris du temps pour essayer de m'aider !!

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Pour le DISTINCT MIN, un minimum est un minimum, et est donc unique !

    Min(3,3,4) renverra 3


    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

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

Discussions similaires

  1. Requête sur une date en spécifiant l'heure
    Par mcfly37 dans le forum SQL
    Réponses: 3
    Dernier message: 26/03/2013, 16h47
  2. [AC-2000] Problème de requête sur une date
    Par egautier18 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/10/2010, 13h36
  3. [CR ?] requête SQL sur une date
    Par czezko dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 23/04/2008, 10h25
  4. Requête sur une plage de date
    Par altecad dans le forum Requêtes
    Réponses: 1
    Dernier message: 23/05/2007, 15h11
  5. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35

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