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

SQL Oracle Discussion :

Division dans une requête [11g]


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut Division dans une requête
    Bonjour,
    j'ai une requête dans laquelle je dois faire une division, mais je n'arrive pas à la faire, chaque fois ça me dit " la commande ne se termine pas correctement" et quand j'enlève la division, ça marche.

    Voici ma requête :

    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
    37
    38
    39
    40
    41
    42
    43
    44
     
    select identifiant,
    (NVL((
    select sum(chiffre1)+sum(chiffre2)
    as "TOTAL GENERAL"
    from table1 t1 
    inner join table2 t5 on t5.id=t1.idrefTable1 
    inner join table3 t8 on t8.id=t5.idref 
    inner join table4 t11 on t11.id=t1.idrefRefT1
    inner join table5 t31 on t31.numcontrat = t1.numcontrat2
    where t8.identifiant='0000379' and t5.annee='73'
    and t31.numcontrat=t1.numcontrat2 
     
    ),0)) as totgeneral,
    (
    NVL((
    select sum(chiffre1)+sum(chiffre2)
    as "TOTAL GENERAL_2"
    from table1 t1 
    inner join table2 t5 on t5.id=t1.idrefTable1 
    inner join table3 t8 on t8.id=t5.idref 
    inner join table4 t11 on t11.id=t1.idrefRefT1
    inner join table5 t31 on t31.numcontrat = t1.numcontrat2
    where t8.identifiant='0000379' and t5.annee='73'
    and t31.numcontrat=t1.numcontrat2 
     
    ),0)
    /    --probleme ici
    (
    SELECT  sum(montant) as encaissement 
    FROM tableEncaissement_1 t12
    inner join tableEncaissement_2 t3 on  t3.id= t12.idreft3
    where t3.idrefentreprise ='1320'
    and t12.code='2003'
    and t12.periode in ('2019M03','2019M02','2019M01')
    and t3.idrefentreprise = t8.id
    )
    )as Total_global
     
    from table1 t1 
    inner join table2 t5 on t5.id=t1.idrefTable1 
    inner join table3 t8 on t8.id=t5.idref 
    inner join table4 t11 on t11.id=t1.idrefRefT1
    where t8.identifiant='123456' and t5.annee='73'
    donc quand je fait la division ça ne marche pas , mais si je remplace par une multiplication ça marche, pourtant je suis sur que ça ne peut pas être une division par 0 car ce groupe là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (
    SELECT  sum(montant) as encaissement 
    FROM tableEncaissement_1 t12
    inner join tableEncaissement_2 t3 on  t3.id= t12.idreft3
    where t3.idrefentreprise ='1320'
    and t12.code='2003'
    and t12.periode in ('2019M03','2019M02','2019M01')
    and t3.idrefentreprise = t8.id
    )
    ne contient pas de 0 on est obligé d'avoir un nombre > à 0 donc je vois pas où ça peut poser problème.

    Merci pour votre aide.

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Bonjour bonjour

    Tout d'abord, pensez à indenter votre code, surtout quand il y a autant de sous requêtes et de parenthéses, cela aidera largement à mieux s'y retrouver.
    Ensuite, pourquoi ne pas mettre chacun des select composant votre division dans une CTE respectives, afin que votre opération puisse être beaucoup plus simplement lisible ?


    Bisous bisous

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Bonjour,
    je fais rarement des cte, je me suis deja documenté dessus, mais je n'ai pas l'habitude d'en faire c'est pour ça .

  4. #4
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Tel que positionné, votre opérateur de division ( / ) est interprété par le moteur SQL comme étant le caractère de fin de requête


    équivalent à
    Faite en sorte que le caractère / ne soit pas le premier caractère de la ligne et soit suivi d'une instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select 10/2 from dual
    /

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2013
    Messages
    933
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 933
    Points : 348
    Points
    348
    Par défaut
    Merci pour votre retour.

    J'ai essayé avec une CTE, comme JeanYvette me l'a dit, une fois que j'ai compris que ça marchait, je l'ai fais avec ma requête ça marche nickel, j'ai fais ceci en gros:

    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
    37
    38
     
    WITH maCTE AS ( 
    SELECT distinct t8.entreprise as entreprise,
    NVL((
    select sum(t2.indmnite1)
    from table t1 
    inner join .....
    where ...
    and ....
    and ....
    ),0) as TOT_indemn_R1,
    NVL((
    select sum(t2.indmnite2)
    from table t1 
    inner join .....
    where ...
    and ....
    and ....
    ),0) as TOT_indemn_R2,
    (
        SELECT  sum(encaissement) as encaissement 
        FROM ..... t12
        inner join ..... 
        where t3..........
        and ....
        and PERIODE in ('2019M03','2019M02'.......)
        and t3.... = t8....
        )as encaissement
    from table1 t1 
    inner join..... 
    inner join ....
    inner join .....
    where t8.entreprise='123456'
     
      ) 
    SELECT entreprise, macte.TOT_indemn_R1,  macte.TOT_indemn_R2,
    round(((macte.TOT_indemn_R1+macte.TOT_indemn_R2)/encaissement)*100,2) as Taux
    FROM maCTE ;
    je saurais quoi faire quand j'aurais un autre soucis avec la division

    merci !

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    C'est pour cela que l'indentation est primordiale, la lisibilité, mais aussi parce que parfois elle nous fait faire de petites erreurs comme cela

    N'hésites pas à mettre en résolu le sujet

    Bisous bisous

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

Discussions similaires

  1. Division dans une requête
    Par minooo dans le forum SQL
    Réponses: 15
    Dernier message: 24/10/2013, 10h48
  2. division par 0 dans une requête donne #Erreur
    Par bugprog dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/05/2007, 09h57
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  4. [SQL] Renommer un champ dans une requête
    Par martonpylon12 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 15/11/2003, 01h59
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 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