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 :

DIVISION dans une requete sql ORACLE


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Tunisie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 9
    Points : 11
    Points
    11
    Par défaut DIVISION dans une requete sql ORACLE
    Bonjour à tous,

    bon ça fait quelques heures que je poirotte sur le forum à la recheche d'une solution à mon probléme: je souhaiterais diviser la valeur d'un champ avec la valeur d'un autre champs:

    j'ai utilisé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT (P.VALEUR_ACTUELLE / P.VALEUR_AQUISITION) AS C_POURCENT
    FROM PORTEFEUILLE P
    ça me fait une erreur, alors que la requete suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT (P.VALEUR_ACTUELLE - P.VALEUR_AQUISITION) AS C_POURCENT
    FROM PORTEFEUILLE P
    donc la soustraction marche mais la division ne marche pas... la division n'existe pas sous oracle ??

    quelqu'un pourrait m'aider à solutionner ça ?

    merci d'avance à tous.

    Medonline

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    La division marche sous oracle.
    Quelle est l'erreur retournée ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 64
    Points : 75
    Points
    75
    Par défaut Division SQL
    Serait-ce une division par ZERO ????

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    C'est ce que je pense.

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  
    decode(P.VALEUR_AQUISITION,
      0,1,
      (P.VALEUR_ACTUELLE /P.VALEUR_AQUISITION)) AS C_POURCENT
    FROM PORTEFEUILLE P
    si valeur acquisition est 0, alors pourcentage = 100% (1)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    oui, ou comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT (P.VALEUR_ACTUELLE / replace(P.VALEUR_AQUISITION, 0, P.VALEUR_ACTUELLE)) AS C_POURCENT
    FROM PORTEFEUILLE P

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Sifo :
    non, replace n'est pas la bonne fonction. de plus, il faut prévoir le cas les deux valeurs sont à zéro

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 116
    Points
    116
    Par défaut
    laurentschneider:
    ok pour les 2 valeurs à zéro.
    Pourquoi Replace ne convient pas ?

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    REPLACE est un remplacement textuel, pas numérique. Autrement dit, si VALEUR_AQUISITION vaut 100 et VALEUR_ACTUELLE 21, ton REPLACE donnera 12121...

    La dernière fois où j'ai été confronté à la division par zéro sous Oracle, DECODE plantait aussi (c'est une fonction, donc tous ses arguments sont évalués en entrée) et il fallait utiliser CASE WHEN.
    Mais c'était sur une vieille version (8i je crois) et dans package mal foutu, ce n'est pas forcément généralisable.

    Au fait, pourquoi générer un 100% en cas de division par zéro ? un NULL me semblerait mathématiquement plus satisfaisant.

    Il me semble que NULLIF existe en Oracle ? Dans ce cas, cela ferait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT P.VALEUR_ACTUELLE / NULLIF(P.VALEUR_AQUISITION, 0) AS C_POURCENT
    FROM PORTEFEUILLE P
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ok pour nullif
    reste à savoir si 0/0 = 100% ,
    pour moi null est bien

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    mathématiquement, 1/0 est infini, et 0/0 est indéterminé... dans les deux cas, NULL me semble le + adapté.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    dans Oracle 10g j'ai trouvé des valeurs spéciales pour définir l'indéfinissable

    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
     
     
    SQL> create table t(n1 binary_double, n2 binary_double);
     
    Table created.
     
    SQL> insert into t values (1,1);
     
    1 row created.
     
    SQL> insert into t values (1,0);
     
    1 row created.
     
    SQL> insert into t values (0,0);
     
    1 row created.
     
    SQL> select n1,n2,n1/n2 from t;
            N1         N2      N1/N2
    ---------- ---------- ----------
      1.0E+000   1.0E+000   1.0E+000
      1.0E+000          0        Inf
             0          0        Nan
    Lire Inf=Infinity et Nan=Not-a-number

Discussions similaires

  1. division dans une requete sql sous asp.net
    Par nlm_look dans le forum ASP.NET
    Réponses: 3
    Dernier message: 28/07/2010, 11h05
  2. couper une chaine dans une requete sql ss oracle
    Par gnaoui_9999 dans le forum Oracle
    Réponses: 2
    Dernier message: 30/05/2008, 18h28
  3. pb de guillemet dans une requete SQL
    Par linouline dans le forum Langage SQL
    Réponses: 1
    Dernier message: 23/12/2005, 11h38
  4. [JDBC]Caractères spéciaux dans une requete SQL
    Par frizby dans le forum JDBC
    Réponses: 2
    Dernier message: 28/11/2005, 18h01
  5. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

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