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

MS SQL Server Discussion :

Calcul de rendement de production, éviter la division par zéro


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut Calcul de rendement de production, éviter la division par zéro
    Bonjour à tous,

    j'écris ne procédure stockée qui doit me calculer le rendement de production pour une date donnée, avec éventuellement des paramètres comme un département bien particulier ou une partie de son nom, même chose pour l'article fabriquée ainsi que pour l'opérateur de production.

    Je calcul le rendement comme étant le rapport entre la quantité de pièces bonnes produites sur la quantité de pièces bonnes attendues, compte tenu du temps de fabrication déclaré.

    J'ai une table rof qui contient les réceptions d'OF, une table sof qui contient les données de suivi d'OF et donc sa gamme (cadence théorique d'une opération), une table art pour les articles, usr pour les utilisateurs, etc...

    Voici mon script :

    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
    SELECT 
    		COALESCE(sum(rof_qte_finie),0) AS Bonnes,
    		COALESCE(sum(rof_qte_rejetee),0) AS Rebuts,
    		COALESCE(sum(rof_duree * sof_cadence),0) AS Attendues,
    		COALESCE(sum(rof_qte_finie)/sum(rof_duree * sof_cadence),0)  AS Rendement
    		FROM rof
    			INNER JOIN ofs  ON rof_of_id = of_id
    			INNER JOIN sof ON rof_of_id = sof_of_id AND rof_op = sof_op
    			INNER JOIN dept ON sof_departement = dept_id
    			INNER JOIN art ON of_article_id = art_id
    			INNER JOIN usr ON rof_qui = usr_id AND usr_operateur = 1
    		WHERE	rof_date = @jour 
    			AND rof_qte_finie >= 0 
    			AND rof_qte_rejetee >= 0
    			AND (
    					(@departement > 0 AND dept_id = @departement)
    					OR 
    					(COALESCE(@departement,0)<= 0 AND dept_nom LIKE '%' + @filtre_departement + '%')
    				)
    			AND (
    					(@article > 0 AND art_id = @article)
    					OR 
    					(COALESCE(@article,0)<= 0 AND art_reference LIKE '%' + @filtre_article + '%')
    				)
    			AND (
    					(@operateur > 0 AND usr_id = @operateur)
    					OR
    					(COALESCE(@operateur,0)<= 0 AND usr_userid LIKE '%' + @filtre_operateur + '%')
    				)
    J'aimerais me prémunir d'une erreur d'exécution au niveau de la formule du rendement, division par zéro dans le cas où la quantité attendue serait nulle (par exemple si j'interroge sur un jour férié) je voudrais déjà éviter l'erreur d'exécution et aussi retourner un rendement de 100%

    Mais comment faire ça directement dans le SELECT ?

    Merci à vous

  2. #2
    Membre chevronné
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour,


    Pourquoi ne pas pas essayer ça ?


    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
     
     
     
    SELECT 
    		COALESCE(sum(rof_qte_finie),0) AS Bonnes,
    		COALESCE(sum(rof_qte_rejetee),0) AS Rebuts,
    		COALESCE(sum(rof_duree * sof_cadence),0) AS Attendues,
                    CASE input_expression 
                    WHEN  COALESCE(sum(rof_qte_finie)/sum(rof_duree * sof_cadence),0)  = 0  THEN 100 
                    ELSE COALESCE(sum(rof_qte_finie)/sum(rof_duree * sof_cadence),0)  
                    END AS Rendement
     
    		FROM rof
    			INNER JOIN ofs  ON rof_of_id = of_id
    			INNER JOIN sof ON rof_of_id = sof_of_id AND rof_op = sof_op
    			INNER JOIN dept ON sof_departement = dept_id
    			INNER JOIN art ON of_article_id = art_id
    			INNER JOIN usr ON rof_qui = usr_id AND usr_operateur = 1
    		WHERE	rof_date = @jour 
    			AND rof_qte_finie >= 0 
    			AND rof_qte_rejetee >= 0
    			AND (
    					(@departement > 0 AND dept_id = @departement)
    					OR 
    					(COALESCE(@departement,0)<= 0 AND dept_nom LIKE '%' + @filtre_departement + '%')
    				)
    			AND (
    					(@article > 0 AND art_id = @article)
    					OR 
    					(COALESCE(@article,0)<= 0 AND art_reference LIKE '%' + @filtre_article + '%')
    				)
    			AND (
    					(@operateur > 0 AND usr_id = @operateur)
    					OR
    					(COALESCE(@operateur,0)<= 0 AND usr_userid LIKE '%' + @filtre_operateur + '%')
    				)

  3. #3
    Membre éclairé Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Par défaut
    oui je n'avais pas pensé au CASE dans le SELECT

    Finalement j'ai fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    		COALESCE(sum(rof_qte_finie),0) AS Bonnes,
    		COALESCE(sum(rof_qte_rejetee),0) AS Rebuts,
    		COALESCE(sum(rof_duree * sof_cadence),0) AS Attendues,
    		CASE COALESCE(sum(rof_duree * sof_cadence), 0)
    		WHEN 0 THEN 100
    		ELSE COALESCE(sum(rof_qte_finie)/sum(rof_duree * sof_cadence)*100,0)
    		END As Rendement
    Et ça marche bien !

    Merci à vous

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 022
    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 : 22 022
    Billets dans le blog
    6
    Par défaut
    Vous pouvez aussi utiliser le NULLIF. Si le diviseur vaut 0 alors, renvoyer un NULL. Le résultat du calcul sera NULL et non une valeur arbitraire qui pourrait fausser d'autres calculs ultérieurs....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. QuickReport : éviter une division par zéro
    Par Powerdj dans le forum Delphi
    Réponses: 5
    Dernier message: 27/11/2015, 11h07
  2. Comment éviter la division par zéro?
    Par hazem2410 dans le forum C#
    Réponses: 3
    Dernier message: 15/11/2010, 18h55
  3. [CR][VS.NET]Division par zéro
    Par San Soussy dans le forum SDK
    Réponses: 2
    Dernier message: 31/08/2005, 15h40
  4. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 14h41
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 19h14

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