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

Requêtes MySQL Discussion :

Requête compliquée pour récupérer des besoins d'approvisionnement de stock


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Requête compliquée pour récupérer des besoins d'approvisionnement de stock
    Bonjour à tous,

    Cette requête doit, par fournisseur, compter les produits qui ont besoin d'être réapprovisionnés.
    Il y a 4 paramètres: le stock, le stock mini, le stock idéal, la quantité attendue.
    La condition 1 est que le stock soit inférieur au seuil mini.
    La seconde condition est que, si la condition 1 est remplie, alors le besoin correspond au stock idéal - le stock réel - la quantité attendue.

    Exemple: stock 0 - stock mini 6 - stock idéal 10 - quantité attendue 4.
    Le besoin pour atteindre le stock idéal est de 10 mais nous en attendons 4, il faudra en commander 6.

    Ma requête:
    Précision même si c'est assez clair et logique:
    quantity est le stock
    warning_stock_level est le stock mini d'alerte
    ideal_stock_level est le stock idéal
    qty_expected est la quantité attendue.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT COUNT(pop.product_id) as NB, p.id_supplier 
    FROM ps_stock_available s 
    LEFT JOIN ps_bms_procurement_product pp ON s.id_product = pp.prestashop_id 
    LEFT JOIN ps_product p ON pp.prestashop_id = p.id_product 
    LEFT JOIN ps_bms_procurement_purchase_order_product pop ON pop.product_id = pp.product_id 
    LEFT JOIN ps_bms_procurement_purchase_order ppo ON ppo.supplier_id = p.id_supplier 
    WHERE s.quantity < pp.warning_stock_level AND pp.ideal_stock_level - (s.quantity + pop.qty_expected) > 0
    GROUP BY p.id_supplier
    Les résultats sont faux. Je pense que le AND pp.ideal_stock_level - (s.quantity + pop.qty_expected) > 0 cloche mais je ne trouve pas la solution. Je regarde du côté de IF et IFNULL mais je ne sais pas utiliser ces fonctions.
    Je vous remercie d'avance pour votre aide précieuse.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 051
    Points : 9 387
    Points
    9 387
    Par défaut
    Tu dis que les résultats sont faux ...
    La requete renvoie trop de lignes, pas assez de ligne, ou bien elle revoie des lignes avec des totaux qui sont faux, ou bien autre chose encore ?

    Ceci dit, dans un premier temps, je remplacerais cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE s.quantity < pp.warning_stock_level AND pp.ideal_stock_level - (s.quantity + pop.qty_expected) > 0
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE coalesce(s.quantity,0) < coalesce(pp.warning_stock_level,0) AND coalesce(pp.ideal_stock_level,0) - (coalesce(s.quantity,0) + coalesce(pop.qty_expected,0)) > 0
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour,

    La requête renvoie quelques lignes, pas d'erreur, mais les résultats sont faux.
    J'ai testé ta modif et les résultats ne changent pas, sauf que des nouveaux résultats à 0 sont sortis.

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 051
    Points : 9 387
    Points
    9 387
    Par défaut
    J'aurais dû mieux lire le besoin avant de proposer une correction.

    Quand un malade se présente, il faut toujours faire un bon diagnostic, et ensuite seulement, proposer des médicaments. Pour l'instant, je ne sais toujours pas si on doit guérir une grippe ou une jambe cassée...
    Même avec ta réponse.

    Il faut toujours décomposer. En tout cas, moi, aprrès 20 ans de pratique de SQL, je ne suis toujours pas capable de faire une requête sans décomposer étape par étape.
    Avant de faire un group by, exécute cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  pop.product_id , p.id_supplier 
    FROM ps_stock_available s 
    LEFT JOIN ps_bms_procurement_product pp ON s.id_product = pp.prestashop_id 
    LEFT JOIN ps_product p ON pp.prestashop_id = p.id_product 
    LEFT JOIN ps_bms_procurement_purchase_order_product pop ON pop.product_id = pp.product_id 
    LEFT JOIN ps_bms_procurement_purchase_order ppo ON ppo.supplier_id = p.id_supplier 
    WHERE s.quantity < pp.warning_stock_level AND pp.ideal_stock_level - (s.quantity + pop.qty_expected) > 0
    En principe, cette requête devrait renvoyer la liste des product_id qui t'intéressent. Mais si tu postes cette question, c'est que le résultat n'est pas bon, pour je ne sais quelle raison.
    Essaie de voir si cette requête renvoie trop de lignes, pas assez ... etc etc.
    Et quand cette requête renverra le bon listing de produits, tu pourras remplacer le détail des product_id par le comptage.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Tu as raison: je vais utiliser ta requête sur les produits (voire sur un produit) et je reviens.
    En fait il manque plein de produits et je comprends pourquoi:

    ces conditions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE s.quantity < pp.warning_stock_level AND pp.ideal_stock_level - (s.quantity + pop.qty_expected) > 0
    Empêche plein de produits de sortir. Je m'explique.
    Un produit à 0 en stock, 6 en stock mini, 12 en stock idéal et 0 attendu.
    Donc la première condition est satisfaite puisque 0 < à 6.
    Mais le AND seconde condition coince : 12 idéal - (0 stock + 0 attendu) est égal à 12...donc supérieur à 0.
    Du coup il sort pas alors qu'il faut en commander...
    Ca progresse.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il semble que la jointure LEFT JOIN ps_bms_procurement_purchase_order ppo ON ppo.supplier_id = p.id_supplier soit peut-être inutile puisque l'alias ppo n'est pas utilisé dans le SELECT ni dans le WHERE.

    Un produit à 0 en stock, 6 en stock mini, 12 en stock idéal et 0 attendu.
    Donc la première condition est satisfaite puisque 0 < à 6.
    Mais le AND seconde condition coince : 12 idéal - (0 stock + 0 attendu) est égal à 12...donc supérieur à 0.
    Du coup il sort pas alors qu'il faut en commander...
    Ben si il doit être retourné par la requête puisque les deux conditions autour du AND sont satisfaites !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [MySQL] Requêtes pHp pour récupérer des données de la BDD
    Par 69Pierre dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 20/10/2014, 17h04
  2. Réponses: 5
    Dernier message: 14/03/2010, 21h50
  3. Requête HTTP pour récupérer des quotations.
    Par Pierre8r dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 18/01/2008, 16h41
  4. Besoin d'aide avec une requete pour récupérer des hyperliens
    Par scaleo dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 21/12/2007, 12h56
  5. Réponses: 2
    Dernier message: 09/11/2006, 07h37

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