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 et SQL. Discussion :

calcul de rendement en SQL


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut calcul de rendement en SQL
    Bonjour,

    Voici le problème auquel je suis confronté:
    Je reçoit du produit (poisson) et je souhaiterai trouver le rendement après transformation (filet ou vidée écaillé).
    J'ai déjà une requête pour faire la somme des poids (merci galoir).
    Nom : Rdt.png
Affichages : 800
Taille : 158,5 Ko
    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
    SELECT
      RE.noLot,
      RD.produit,
      Nz(SumPoidsDemDet) / SumRecetPoids AS RatioPoids
    FROM (Reception AS RE
    INNER JOIN (SELECT
      noLot,
      produit,
      SUM(Poids) AS SumRecetPoids
    FROM RecepDetails
    GROUP BY noLot,
             produit) AS RD
      ON RE.noLot = RD.noLot)
    LEFT JOIN (SELECT
      DD.noLot,
      produit,
      SUM(DP.PoidsDemDet) AS SumPoidsDemDet
    FROM DemDetails AS DD
    INNER JOIN DemPoids AS DP
      ON DD.noDemDetail = DP.noDemDetail
    GROUP BY DD.noLot,
             produit) AS D
      ON (RD.produit = D.produit)
      AND (RD.noLot = D.noLot)
    ORDER BY RE.noLot, RD.produit
    J'aimerai maintenant compléxifier un peu les choses. Dans la table DemDetails, il y a un champ "transfo" pour transfomation. la plupart du temps je ne fais qu'un seul type de transformation par noLot mais il arrive que j'en fasse plusieurs. le champ transformation comprend plusieurs valeurs mais restons sur 2 valeurs pour l'instant. Donc disons que le produit c'est du rouget, il peut y avoir soit du vidé écaillé rendement au environ de 90%, soit du filet avec un rendement avoisinant les 35% à contrôler.

    Je cherche à faire quelque chose proche de l'exemple suivant: si je reçoit 100 kg de rouget et que je décide d'en travailler 50kg en filet et 50kg en vidé écaillé, alors quel est mon rendement de filet ? normalement : rdt filet = poids filet / (100 - poids vidé écaillé / 90%)

    Maintenant, j'aimerai que la valeur de 90% soit récupérer dans une table RdtHisto avec 3 champs (produit, transfo, rdt), les 2 premiers champs servant de clé primaire.

    je pense donc à la chose suivante, sur la colonne "SumRecetPoids" il faut que sur chaque numéro de lot (noLot) pour lequel il y a du filet, on retranche la somme des SumRecetPoids qui ne sont pas du filet.

    Par ailleurs il faut faire attention à une chose, si sur un noLot je ne fais pas de filet mais juste du vidé écaillé, le rendement ne doit pas etre pris dans la table RdtHisto mais calculé comme dans la requête de galoir "Nz(SumPoidsDemDet) / SumRecetPoids".

    En gros, le filet est tout le temps calculé mais le reste n'est calculé que si il n'y a pas de filet.

    Je ne sais pas si c'est compréhensible ce que je raconte :-)

    Merci d'avance à celui ou celle qui pourra m'aider.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    à tester :
    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
    SELECT RE.nolot,
           RD.produit,
           Iif(Nz([sumpoidsrdthorsfilet]) = 0, Nz([sumpoids]) / [sumreceppoids], [sumpoidsfilet] / ( [sumreceppoids] - [sumpoidsrdthorsfilet] )) AS RatioPoids
    FROM   (reception AS RE
            INNER JOIN (SELECT nolot,
                               produit,
                               SUM(poids) AS SumRecepPoids
                        FROM   recepdetails
                        GROUP  BY nolot, produit) AS RD
                    ON RE.nolot = RD.nolot)
           LEFT JOIN (SELECT r.nolot,
                             r.produit,
                             SUM(Iif([transfo] = "filet", [SumPoidsTransfo], 0)) AS SumPoidsFilet,
                             SUM(Iif([transfo] <> "filet", [SumPoidsTransfo] * [rdt], 0)) AS SumPoidsRdtHorsFilet,
                             SUM([SumPoidsTransfo]) AS SumPoids
                      FROM   (SELECT DD.nolot,
                                     DD.produit,
                                     DD.transfo,
                                     RH.rdt,
                                     SUM(DP.poidsdemdet) AS SumPoidsTransfo
                              FROM   (demdetails AS DD
                                      INNER JOIN dempoids AS DP 
                                            ON DD.nodemdetail = DP.nodemdetail)
                                     LEFT JOIN rdthisto AS RH
                                            ON DD.produit = RH.produit AND DD.transfo = RH.transfo
                              GROUP  BY DD.nolot,
                                        DD.produit,
                                        DD.transfo,
                                        RH.rdt) AS r
                      GROUP  BY r.nolot, r.produit) AS D
                  ON RD.nolot = D.nolot AND RD.produit = D.produit
    ORDER  BY RE.nolot, RD.produit

  3. #3
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Bonjour Galoir,

    Ton code me renvoit "Type de données incompatible dans l'expression du critère."

    Sinon je suis aussi en train d'essayer de mon coté. Saurais tu me dire pourquoi j'ai une erreur entre le ligne 19 et 20. Access me renvoit l'erreur suivante: "erreur de syntaxe (opérateur absent) dans l'expression "DD.noDemDetail = DP.noDemDetail
    LEFT JOIN RendementHisto as RH
    ON (DD.produit = RH.produit"
    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
    SELECT RE.noLot, 
    RD.produit, 
    D.DD.transfo,
    D.SumPoidsDemDet, 
    D.rdmtHisto,
    RD.SumRecetPoids, 
    Nz(SumPoidsDemDet)/SumRecetPoids AS RatioPoids
    FROM ( Reception AS RE 
           INNER JOIN ( SELECT noLot, produit, SUM(Poids) AS SumRecetPoids 
                        FROM RecepDetails GROUP BY noLot, produit
           ) AS RD ON RE.noLot = RD.noLot
         ) 
     
    LEFT JOIN 
    ( SELECT DD.noLot, DD.produit, DD.transfo, RH.rdmtHisto, SUM(DP.PoidsDemDet) AS SumPoidsDemDet 
      FROM DemDetails AS DD 
      INNER JOIN DemPoids AS DP 
      ON DD.noDemDetail = DP.noDemDetail 
      LEFT JOIN RendementHisto as RH
      On (DD.produit = RH.produit) AND (DD.transfo = RH.transfo)
      GROUP BY DD.noLot, DD.produit, DD.transfo
    ) AS D 
    ON (RD.produit = D.produit) AND (RD.noLot = D.noLot)
     
    ORDER BY RE.noLot, RD.produit, D.DD.transfo;
    Merci d'avance

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Ma requête a été testée et ne renvoie aucun message d'erreur si on respecte bien le nom des tables et colonnes mais je vois que tu as changer le nom de la table, nom des colonnes, nom d'alias,...

    Voilà mon conseil :
    1) Conserver le nom initial des alias et de la table : "rdthisto" et le nom de ces colonnes (produit, transfo, rdt) utilisaient dans ma requête
    2) Tester le résultat de la requete
    3) on discute ensemble si résultat ne correspond à tes attentes
    4) sur requete définitive, modifier nom de table et adapter le nom de la table dans la requete, vérifier fonctionnement. Puis modifier nom des colonnes et adapter la requete, vérifier, ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    J'avais déjà fait les modification des alias et table pour correspondre à ton code. j'ai toujours l'erreur cité précédemment.

  6. #6
    Invité
    Invité(e)
    Par défaut
    le type des colonnes de la table rdthisto sont-ils bien :
    -> Produit : type texte
    -> Transfo : type texte
    -> rdt : type numérique réel double

  7. #7
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    non les 3 sont de type numérique sachant que les colonnes "produit" et "transfo" sont des listes qui viennent d'autres tables. elles pointent sur la clé primaire mais j'affiche la colonne texte ( 2eme colonne) et j'ai rajouter une intégrité référentielle un à plusieurs.

  8. #8
    Invité
    Invité(e)
    Par défaut
    ok, dans ma requete j'ai mis [transfo] = "filet" et [transfo] <> "filet" il faut don remplacer "filet" par l'Id correspondant à "filet" de la table DemDetails puis retester la requête
    Dernière modification par Invité ; 26/07/2017 à 07h02.

  9. #9
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Hello,

    j'ai légèrement changer le code pour afficher le rendement par transfo
    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 RE.nolot,
    RD.produit,
    r.transfo,
    Iif(Nz([sumpoidsrdthorsfilet]) = 0, Nz([sumpoids]) / [sumreceppoids], [sumpoidsfilet] / ( [sumreceppoids] - [sumpoidsrdthorsfilet] )) AS RatioPoids
    FROM   (reception AS RE
            INNER JOIN (SELECT nolot,
                        produit,
                        SUM(poids) AS SumRecepPoids
                        FROM   recepdetails
                        GROUP  BY nolot, produit) AS RD
            ON RE.nolot = RD.nolot)
    LEFT JOIN (SELECT r.nolot,
               r.produit,
               r.transfo,
               SUM(Iif([transfo] = 2, [SumPoidsTransfo], 0)) AS SumPoidsFilet,
               SUM(Iif([transfo] <> 2, [SumPoidsTransfo] / [rdt], 0)) AS SumPoidsRdtHorsFilet,
               SUM([SumPoidsTransfo]) AS SumPoids
               FROM   (SELECT DD.nolot,
                       DD.produit,
                       DD.transfo,
                       RH.rdt,
                       SUM(DP.poidsdemdet) AS SumPoidsTransfo
                       FROM   (demdetails AS DD
                               INNER JOIN dempoids AS DP 
                               ON DD.nodemdetail = DP.nodemdetail)
                       LEFT JOIN rdthisto AS RH
                       ON DD.produit = RH.produit AND DD.transfo = RH.transfo
                       GROUP  BY DD.nolot,
                       DD.produit,
                       DD.transfo,
                       RH.rdt) AS r
               GROUP  BY r.nolot, r.produit,r.transfo) AS D
    ON RD.nolot = D.nolot AND RD.produit = D.produit
    ORDER  BY RE.nolot, RD.produit
    le truc c'est que j'ai 6 types de transformations donc j'aimerai avoir quelquechose qui ressemble au calcul suivant:
    si sur un numéro de lot, j'ai
    1/ 1 transfo, rdt classique soit poids transfo / brut
    2/ plusieurs transfo dont filet, le poids brut est modifié pour chacune des transfo. Pour le brutModif des transfo hors filet, on fait sumPoidsTransfoHF / rdt et pour le brutModif du filet ont fait poidsLot - Somme(sumPoidsTransfoHF)
    3/ plusieurs transfo mais pas de filet, le poids brut est modifié pour chacune des transfo sauf la dernière calculé (peu importe laquelle). Pour le brutModif des transfo, on fait sumPoidsTransfo / rdt et pour le brutModif de la dernière on fait poidsLot - Somme(sumPoidsTransfo).

    Et pour finir pour le calcul du rendement, on fait sumPoidsTransfo / brutModif

    Je ne sais pas si c'est faisable. Le plus facile serait une boucle mais j'ai l'impression qu'il n'y a pas de récursivité en SQL.
    Peut être passer sur du vba, qu'est ce que tu en penses?

    Merci pour ton aide

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    vba ou requete ce n'est pas le problème de choisir l'outils mais avant tout il faut définir clairement la demande :
    -> Affichage par lot ou transfo ? Colonnes à retourner ?
    -> Formules précises et définitives pour chaque cas

    Bonnes vacances

  11. #11
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Excuse moi je pensais que c'était clair.
    j'ai volontairement réduit la difficulté.
    le champ transformation comprend plusieurs valeurs mais restons sur 2 valeurs pour l'instant.
    c'est ma façon d'appréhender un problème, par étape.

    Donc en effet il faut le rendement par lot et par transformation.
    Après pour la manière de procéder, j'ai donné un exemple dans le 1er message mais on peux surement faire autrement.

  12. #12
    Membre à l'essai
    Homme Profil pro
    entrepreneur
    Inscrit en
    Juillet 2017
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : entrepreneur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Bonjour galoir,

    j'espère que les vacances furent bonnes :-)
    je reste coincé sur mon problème, aurais tu une solution en SQL.

    Merci de ton aide

Discussions similaires

  1. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29
  2. [ WinDev ] Calcul sur date dans SQL
    Par Tchupacabra dans le forum Langage SQL
    Réponses: 8
    Dernier message: 28/02/2006, 12h12
  3. Calcul sur date dans SQL
    Par Tchupacabra dans le forum WinDev
    Réponses: 4
    Dernier message: 27/02/2006, 19h23
  4. Calcul ou Stockage en SQL ?
    Par webof dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 16/03/2005, 18h42
  5. Calcul Matriciel en PL/SQL
    Par PpPool dans le forum PL/SQL
    Réponses: 4
    Dernier message: 02/02/2004, 10h11

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