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 :

Requête avec jointure et conditions arithmétiques


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Requête avec jointure et conditions arithmétiques
    Bonjour,


    Je suis débutant en SQL et j'ai besoin de vos lumières.
    Pour gérer un stock j'ai deux tables dans MySQL : entreestock et sortiestock :
    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
    36
    37
    38
    39
    CREATE TABLE IF NOT EXISTS `entreestock` (
      `NUM_LIGNEBLF` int(11) NOT NULL AUTO_INCREMENT,
      `CODE_PROD` varchar(25) NOT NULL,
      `CODE_LIVRF` varchar(11) NOT NULL,
      `QTE_RECUE` int(4) NOT NULL,
      `SN_PRODESTOCK` varchar(25) NOT NULL,
      `lot` int(11) NOT NULL,
      PRIMARY KEY (`NUM_LIGNEBLF`),
      KEY `UNELIGNEPARPRODUITLIVRPARFR_FK` (`CODE_PROD`),
      KEY `LIVRFRCPORTEPLRSLIGNES_FK` (`CODE_LIVRF`),
      KEY `CODE_LIVRF` (`lot`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7;
     
    INSERT INTO `entreestock` (`NUM_LIGNEBLF`, `CODE_PROD`, `CODE_LIVRF`, `QTE_RECUE`, `SN_PRODESTOCK`, `lot`) VALUES
    (1, 'hp49A', 'BLF131001', 10, ' ', 1001),
    (2, 'HP121N', 'BLF131001', 14, ' ', 1001),
    (3, 'HP121N', 'BLF131002', 6, ' ', 1002),
    (4, 'hp1000', 'BLF131002', 2, 'SN1000/1001', 1002),
    (5, 'hp49A', 'BLF131002', 3, ' ', 1002);
     
    CREATE TABLE IF NOT EXISTS `sortiestock` (
      `NUM_LIGNEBLC` int(9) NOT NULL AUTO_INCREMENT,
      `CODE_PROD` varchar(25) NOT NULL,
      `CODE_BLCLIENT` varchar(11) NOT NULL,
      `QTE_LIVREE` int(4) NOT NULL,
      `SN_ARTICLE` char(25) DEFAULT NULL,
      `LOT` int(11) NOT NULL,
      PRIMARY KEY (`NUM_LIGNEBLC`),
      KEY `UNELIGNEPARPRODUITLIVRECL_FK` (`CODE_PROD`),
      KEY `LIVRCLIENTCPORTEPLRSLIGNES_FK` (`CODE_BLCLIENT`),
      KEY `LOT` (`LOT`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
     
    INSERT INTO `sortiestock` (`NUM_LIGNEBLC`, `CODE_PROD`, `CODE_BLCLIENT`, `QTE_LIVREE`, `SN_ARTICLE`, `LOT`) VALUES
    (1, 'hp49A', 'BLC131001', 2, '', 1001);
     
    ALTER TABLE `sortiestock`
      ADD CONSTRAINT `sortiestock_ibfk_12` FOREIGN KEY (`CODE_BLCLIENT`) REFERENCES `livraisonclient` (`CODE_BLCLIENT`) ON DELETE CASCADE ON UPDATE CASCADE,
      ADD CONSTRAINT `sortiestock_ibfk_13` FOREIGN KEY (`LOT`) REFERENCES `entreestock` (`lot`);
    Mon problème se situe au niveau du lot.

    Je veux une requête qui me retourne le numéro du lot à partir de entreestock
    selon les conditions ci-après :
    • entreestock.code_prod = le produit en question
    • entreestock.lot = le lot du produit en question
    • entreestock.qte_recue - sortiestock.qte_livree >0

    On suppose que :
    1. un produit peut ne pas être dans sortiestock car pas encore livré
    2. un produit peut être dans plusieurs lots différents et avec des quantités différentes au niveau d'entreestock

    En cas de résultats multiples, la requête doit sortir chaque fois un seul lot qui remplit les conditions au fur et à mesure que la table sortiestock est alimentée
    jusqu'à ce que le lot concerné soit épuisé au stock.

    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select e.lot from entreestock e WHERE exists  ( 
     
    select distinct e.lot as lot, e.`QTE_RECUE`, e.`NUM_LIGNEBLF`,
    coalesce(s.`QTE_LIVREE`,0) as qte_livree,  
    e.`QTE_RECUE`-coalesce( s.`QTE_LIVREE`,0) as reste from entreestock e
     LEFT OUTER join sortiestock s on
    (e.`CODE_PROD`= coalesce(s.`CODE_PROD`,e.`CODE_PROD`)
    and e.`CODE_PROD`='hp1000')
    group by lot 
    having reste >0 limit 2
     
    )  limit 1
    Mais non seulement s.qté_livree ne varie pas, mais quand on change d'article aussi ça retourne toujours le lot 1001.

    Merci de votre précieuse aide.

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Questions:
    1->quelle est la signification de lot?
    2->Pourquoi limit 1 et limit 2?

    Peux-tu donner (sous forme de tableau) le résultat souhaité avec une petite description.

    Ta sous-requête pose un problème. WHERE EXISTS doit introduire une sous-requête corrélée (dépendante de la requête principale); ce qui n'est pas le cas chez toi. Je ne comprends d'ailleurs pas pourquoi le SGBD accepte FROM entreestock e à la fois dans la requête principale et la sous-requête.
    @+

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bjr alassanediakite;
    pour etre plus clair :
    --------- dans ma table entreestock j'ai reçu :
    --10 unités de l'article hp49A identifié par le lot 1001
    -- 03 autres unités du meme article hp49A identifié par le lot 1002
    -------------dans ma table sortiestock je voudrais:
    -à chaque sortie de l'article hp49A, le sgbd me propose un lot.
    Ex:
    entreestock e
    e.NUM_LIGNEBLF e.CODE_PROD e.QTE_RECUE e.lot
    1 HP49A 10 1001
    2 HP49A 3 1002
    TOTAL 13


    sortiestock s
    s.NUM_LIGNEBLC s.CODE_PROD s.QTE_RECUE s.lot
    1 HP49A 2 ?
    2 HP49A 6 ?
    3 HP49A 3 ?
    4 HP49A 1 ?
    5 HP49A 1 ?
    TOTAL 13







    (1001 ou 1002 selon , et ceci jusqu'à la fin du stock dispo au niveau de entreestock.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bjr,
    desolé pour la presentation de tout à l'heure.
    j'ai fait 1 tableau representant mes 2 tables en fichier joint.
    Je crois que dans ma requete il faut inserer la quantité à livrer:
    ex: je livre 7 hp1000 , à partir du lot retourné par cette requete depuis entreestock:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select distinct e.lot as lot,
    e.`QTE_RECUE`-coalesce( s.`QTE_LIVREE`,0) as reste 
    from entreestock e
     LEFT OUTER join sortiestock s on
    (e.`CODE_PROD`= coalesce(s.`CODE_PROD`,e.`CODE_PROD`)
    and e.`CODE_PROD`='hp1000'
    and  s.`QTE_LIVREE`=7 )
    group by lot 
    having reste >7
    Merci de me proposer plus simple .
    Cdlt.
    Images attachées Images attachées

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Re requete avec jointure et conditions arythmetiques
    'est encore moi,
    j'ai affiné mes essais et j'ai pu obtenir par la creation d'un view le resultat que je veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace view vlot as
    select distinct e.lot as lot,
    e.`QTE_RECUE`-coalesce( s.`QTE_LIVREE`,0) as reste 
    from entreestock e
    left join sortiestock s on
    (e.`CODE_PROD`= coalesce(s.`CODE_PROD`,e.`CODE_PROD`)
    and e.lot= coalesce(s.lot,e.lot))
    where e.`CODE_PROD`='HP49A'
    group by lot 
    having reste  >=8 limit 1;
    select v.lot from vlot v ;
    Malheureusement sur java jsf la requete avec view ne passe pas.
    Y'aurait il une autre solution sans passer par create view?
    Leserigne

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Euh... alors jsf n'a rien à voir avec la possibilité, ou non, de faire une selection en sql.

    Et en java vous pouvez tout à fait faire un select sur une vue.

    A partir de là ... je ne sais pas ce que vous essayez de faire.


    Sinon une vue n'est qu'un "alias" d'une requête, donc utilisez la requête directement au pire ...

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Rebonjour;
    comment peut on ecrire la requete sans passer par la vue.
    j'ai essayé aussi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select e.lot from entreestock e where e.lot in(
    select distinct e.lot as lot,
    e.`QTE_RECUE`-coalesce( s.`QTE_LIVREE`,0) as reste 
    from entreestock e
    left join sortiestock s on
    (e.`CODE_PROD`= coalesce(s.`CODE_PROD`,e.`CODE_PROD`)
    and e.lot= coalesce(s.lot,e.lot))
    where e.`CODE_PROD`='IR1600'
    group by lot 
    having reste  >=1 limit 1
    )
    mais encore une fois mysql me retourne l'erreur suivante:
    Code erreur 1235, état SQL 42000: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
    j'utilise mysql v5.5.20
    pour rappel je veux que la reque me retourne uniquement le numero de lot.

Discussions similaires

  1. Requête avec jointure et condition en Dcount
    Par amartik dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/02/2010, 13h22
  2. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  3. Requête avec jointures
    Par Corben dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h55
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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