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 :

Problème de division


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut Problème de division
    Bonjour à tous.

    J'ai un petit soucis au niveau d'une division.
    Je veux en fait calculer le pourcentage de deux colonnes.

    Donc je dois faire ( col1/col2 ) * 100.

    Si je mets un + cela marche, mais si je mets un / il me renvoie toujours 0...

    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
    SELECT
        SUM(CASE WHEN PPQCStatus = 0 THEN 1 END) + SUM(CASE WHEN PPQCStatus LIKE '%' THEN 1 END) AS Pourcentage,
        SUM(CASE WHEN PPQCStatus = 1 THEN 1 END) AS Nbr_First_NG,
        SUM(CASE WHEN PPQCStatus = 0 THEN 1 END) AS Nbr_First_OK,
        SUM(CASE WHEN PPQCStatus LIKE '%' THEN 1 END) AS Production_Volume_,
        Convert(int, Month([PPTimeStamp])) AS Month,
        Convert(int, Year ([PPTimeStamp])) AS Year,
        PPProcessNumber
    FROM
        passage
    WHERE 
        PPProcessNumber IN ('3290', '3480')
    AND PPPassageNumber = '1'
    AND PPTimeStamp > '2010-06-01 00:00:00'
    AND PPTimeStamp < '2010-06-30 23:59:59'
    GROUP BY
        Convert(int, Month([PPTimeStamp])),
        Convert(int, Year ([PPTimeStamp])),
        PPProcessNumber
    ORDER BY
        Convert(int, Month([PPTimeStamp])) asc,
        Convert(int, Year ([PPTimeStamp])) asc,
        PPProcessNumber asc;
    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Si je ne m'abuse, avec certains SGBD le calcul sur des entiers renvoie... un entier.
    Donc ici le résultat de ta division prend une valeur entre 0 et 1, et arrondie renvoie 0.
    Essaie ( col1 * 100 )/col2 pour voir si ça change le résultat.

    Tatayo.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    effectivement !

    Il me renvoie bien mon poucentage maintenant

    Mais mon pourcentage est un entier, comment je peux faire pour le convertir en 2 chiffres apres la virgule ?

    merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Faites *100.00, ça forcera la conversion avec deux décimales.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    Oui j'ai bien un nombre à virgules mais il m'affiche 98,2427283.....
    Si je fais un Round(...,2) il m'affiche alors 98,24000000


    Je regarde pour faire 98,24 ..... si vous avez une idée

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    Peut-être avec un RTRIM après le ROUND() :
    Ceci renvoie : 14.23

    Il faudra donc faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RTRIM(ROUND(...,2), '0')

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    hummmm il me renvoie cette erreur...


    Msg 174, Level 15, State 1, Line 3
    The rtrim function requires 1 arguments.

    j'ai bien mis le '0' pourtant...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    j'ai repris ta méthode mais avec la fonction replace

    replace ($chaine,'0','') et ca fonctionne.

    Merci à tous

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Je vous déconseille très fortement ce que vous venez de faire !

    Si votre résultat renvoie 10.01, vous allez vous retrouver avec 1.1 en résultat, ce qui est complètement faux.

    Essayez de transformer à l'aider de la fonction CAST le résultat dans un decimal(5,2) par exemple (à adapter selon les types supportés par votre SGBD).

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 80
    Points
    80
    Par défaut
    Ah bizarre, chez moi ça fonctionne.
    Peut-être que le second argument (ici '0') est propre à Oracle ...

    En tout cas tu as trouvé une alternative qui fonctionne c'est l'essentiel

    Edit : Pas bête ta remarque Waldar on n'avait pas pensé à ça ^^ bien que normalement avec la fonction RTRIM, ça n'enlève que les '0' qui sont en fin de chaîne ... D'ailleurs pourquoi elle fonctionne chez moi sous Oracle, mais pas chez bullrot ? Ce n'est pas du SQL Standard ?

    Edit 2 : J'ai trouvé le motif (2ème argument) n'est pas compatible avec MySQL, si c'est cela que tu utilises, tu peux alors faire : TRIM(TRAILING '0'
    FROM 13.24000) et là ça fonctionne (ça supprime les 0 en fin de chaine) !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    Je vous déconseille très fortement ce que vous venez de faire !

    Si votre résultat renvoie 10.01, vous allez vous retrouver avec 1.1 en résultat, ce qui est complètement faux.

    Essayez de transformer à l'aider de la fonction CAST le résultat dans un decimal(5,2) par exemple (à adapter selon les types supportés par votre SGBD).
    Pas faux.. j'avais pas pensé a cela....

    Pour le cast .... Varchar(5) il me renvoie :

    Arithmetic overflow error converting numeric to data type varchar.
    Warning: Null value is eliminated by an aggregate or other SET operation.
    shaoling : oui sauf que TRIM n'est pas reconnu...lol

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    593
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 593
    Points : 146
    Points
    146
    Par défaut
    cast(round(((SUM( CASE WHEN PPQCStatus = 0 THEN 1 END) *100.0) / (SUM( CASE WHEN PPQCStatus LIKE '%' THEN 1 END))),2) as decimal(5,2)) as Pourcentage,


    voila qui est mieux

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Si PPQCStatus ne peut pas être nul, vous pouvez simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(round((sum(case PPQCStatus when 0 then 1 end) * 100.0) / count(*), 2) as decimal(5,2)) as Pourcentage,

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

Discussions similaires

  1. Un problème de division
    Par chxlgs dans le forum Débuter
    Réponses: 3
    Dernier message: 27/02/2008, 12h28
  2. Problème de division
    Par luimême dans le forum Mathématiques
    Réponses: 4
    Dernier message: 04/05/2007, 17h41
  3. Problème de Division
    Par Dlyan dans le forum C++
    Réponses: 5
    Dernier message: 09/03/2006, 15h24
  4. problème de division par 100
    Par trent94 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/11/2005, 22h08
  5. [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, 13h41

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