Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1892 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Comment éviter une division par 0 (zéro) --> résolu par DECODE()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Comment éviter une division par 0 (zéro) --> résolu par DECODE()

n°853957
camarchepo​a
m'enfin !
Posté le 20-09-2004 à 11:18:22  profilanswer
 

Bonjour !
 
je voudrai faire un SUM() dans une requête SQL qui contient une division.
 
du style SUM (A/B)
 
Mais il se peut que B soit égal à 0 (mais pas null)
 
Dans ce cas j'ai une erreur :D
 
alors est-ce-qu'il existe une fonction du genre ISZERO() :D ?
 
Merci !


Message édité par camarchepoa le 20-09-2004 à 13:24:33
mood
Publicité
Posté le 20-09-2004 à 11:18:22  profilanswer
 

n°853960
gizmo
Posté le 20-09-2004 à 11:22:22  profilanswer
 

Pa spécialement. Par contre, il existe toujours le comparateur classique != (ou <> suivant le SDGB)

n°853974
DjobaDjobi
Wanna turn up the heat?
Posté le 20-09-2004 à 11:38:55  profilanswer
 

rajout un where b <>0 dans ta requete !
quel comportement attend-tu si b=0 ?

n°853982
camarchepo​a
m'enfin !
Posté le 20-09-2004 à 11:49:24  profilanswer
 

Merci pour ces pistes mais il ne faut pas que j'exclue les lignes ou B=0
 
Si B=0 il faut que SUM(A/B) renvoie 0  
 
je voi vraiment pas moi :(

n°853989
pc75
Posté le 20-09-2004 à 11:54:20  profilanswer
 

Bonjour,
 
Une requête dans ce genre là pourrait être un début de piste ?
 
select sum(A/B) as Result where B > 0
union
select 0 as Result where B = 0

n°853993
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-09-2004 à 12:03:00  profilanswer
 

quel sgbd ?
 
avec Oracle, tu as DECODE (je crois qu'il existe aussi en MySQL) :
 
SELECT SUM(DECODE(B, 0, B, A/B))
FROM ...

n°854011
sircam
I Like Trains
Posté le 20-09-2004 à 12:33:23  profilanswer
 

Ce genre de fonctions dépend du RDBMS.
 
Les unions sont à éviter car peu performantes.
 
La solution proposée par Arjuna est plus indiquée. Des fonctions équivalentes existent pour la plupart des RDBMS ("if" plus probablement).


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°854016
camarchepo​a
m'enfin !
Posté le 20-09-2004 à 12:42:36  profilanswer
 

merci pour toutes ces réponses !!
 
 
c'est avec informix ... tout le monde n'est pas à la pointe de la technologie :D
 
je vais voire si DECODE peut fonctionner ;)

n°854019
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-09-2004 à 12:45:03  profilanswer
 

Petit rappel au niveau des UNION.
 
Le UNION fait de base un DISTINCT, et c'est ça qui consomme énorméménent de ressources, surtout si le nombre de lignes est important et certaines colonnes calculées.
 
Il faut donc systématiquement utilise la clause "UNION ALL", à moins qu'on ait besoin du distinct. En effet, vous pouvez tester, le UNION ALL ne dédoublonne pas les résultats, ce qui le rends infiniment plus rapide qu'un UNION classique.

n°854020
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-09-2004 à 12:45:42  profilanswer
 

camarchepoa a écrit :

merci pour toutes ces réponses !!
 
 
c'est avec informix ... tout le monde n'est pas à la pointe de la technologie :D
 
je vais voire si DECODE peut fonctionner ;)


Sinon ce sera certainement IF() ou IIF() comme l'a di sircam

mood
Publicité
Posté le 20-09-2004 à 12:45:42  profilanswer
 

n°854021
sircam
I Like Trains
Posté le 20-09-2004 à 12:47:26  profilanswer
 

Arjuna a écrit :

Petit rappel au niveau des UNION.
 
Le UNION fait de base un DISTINCT, et c'est ça qui consomme énorméménent de ressources, surtout si le nombre de lignes est important et certaines colonnes calculées.
 
Il faut donc systématiquement utilise la clause "UNION ALL", à moins qu'on ait besoin du distinct. En effet, vous pouvez tester, le UNION ALL ne dédoublonne pas les résultats, ce qui le rends infiniment plus rapide qu'un UNION classique.


Déjà, c'est une bonne remarque.
 
Mais si tu fais un UNION ALL entre deux select, le RDBMS ne va-t-il pas de toute façon exécuter les deux queries séparemment avant d'ensembler un résultat unique, si je ne me trompe ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°854026
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-09-2004 à 12:52:32  profilanswer
 

Oui en effet. Mais lors d'une requête classique, par exemple :
 
SELECT NOM, PRENOM
FROM UTILISATEUR
WHERE DATE_NAISANCE > '01/01/1980'
 
ton SGBD va prendre 1 ou 2 % pour comprendre la requête et trouver l'index à utiliser.
5 à 20 % pour éxécuter la requête.
Puis tout le reste à construire un curseur pour te rammener les lignes.
 
Avec un UNION ALL, il va donc doubler les deux premières étapes mais la dernière, qui est la plus longue, durera le même temps. La perte de perfs est alors acceptable.
 
Ceci dit, quand on peut éviter un UNION, il faut toujours l'éviter, car en effet ça restera dans tous les cas plus lent qu'une autre solution ;)

n°854039
camarchepo​a
m'enfin !
Posté le 20-09-2004 à 13:23:53  profilanswer
 

.
 
merci à tous pour votre aide !
 
ca fonctionne à meveillle avec le DECODE() :)
 
j'édite le titre en conséquence ;)

n°854066
sircam
I Like Trains
Posté le 20-09-2004 à 13:55:01  profilanswer
 

Arjuna a écrit :

Oui en effet. Mais lors d'une requête classique, par exemple :
 
SELECT NOM, PRENOM
FROM UTILISATEUR
WHERE DATE_NAISANCE > '01/01/1980'
 
ton SGBD va prendre 1 ou 2 % pour comprendre la requête et trouver l'index à utiliser.
5 à 20 % pour éxécuter la requête.
Puis tout le reste à construire un curseur pour te rammener les lignes.
 
Avec un UNION ALL, il va donc doubler les deux premières étapes mais la dernière, qui est la plus longue, durera le même temps. La perte de perfs est alors acceptable.
 
Ceci dit, quand on peut éviter un UNION, il faut toujours l'éviter, car en effet ça restera dans tous les cas plus lent qu'une autre solution ;)


Bon à savoir, je ne connaissais pas les proportions entre les différentes étapes. Merci.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°854093
Arjuna
Aircraft Ident.: F-MBSD
Posté le 20-09-2004 à 14:10:54  profilanswer
 

les proportins sont loin d'êtres exactes (ça dépends d'énormément de choses).
mais c'est globalement dans ces proportions :
- Le plus long est presque toujours la récupération des donnés une fois la requêtes exécutée, sauf dans le cas où tu as très peu de données évidement
- Ensuite, c'est l'éxécution de la requête. Selon si tu as des jointures externes, des fonctions de regroupement et des sous-requêtes, ça peut changer du tout au tout la vitesse de cette étape
- Et le plus cour c'est évidement le parse de la requête SQL et la recherche des indexes à utiliser.

n°854105
sircam
I Like Trains
Posté le 20-09-2004 à 14:20:11  profilanswer
 

J'aurais tablé sur l'exécution sensu stricto comme facteur déterminant. Maintenant, si les index sont bons et les queries simples, je comprends que cette étape prenne proportionnelement moins de temps.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°854508
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-09-2004 à 00:47:02  profilanswer
 

sensu stricto, tu parles du parsing et de l'optimisation ?
 
disons que d'un SGBD à l'autre, ça doit changer en effet, mais le parsing est relativement simple, quand à l'optimisation, c'est basé sur des algo "tous fais", donc l'optimiseur n'a qu'à vérifier que la requête contient certains patterns afin d'appliquer la bonne méthode, c'est assez rapide.
 
Ensuite par contre, la lecture des index, les tris, et surtout les regroupements ça bouffe énormément de temps, d'autant plus quand il y a des distinct : une première lecture pour faire un tri temporaire, puis une seconde lecture pour virer les doublons, c'est la mort pour le SGBD. Ensuite, pour la construction du curseur et la récupération des indexes, je pense que ça se passe d'explications, ça extrêment lent, à cause de limitations purement matérielles.

n°854603
sircam
I Like Trains
Posté le 21-09-2004 à 10:03:21  profilanswer
 

Arjuna a écrit :

sensu stricto, tu parles du parsing et de l'optimisation ?
 
disons que d'un SGBD à l'autre, ça doit changer en effet, mais le parsing est relativement simple, quand à l'optimisation, c'est basé sur des algo "tous fais", donc l'optimiseur n'a qu'à vérifier que la requête contient certains patterns afin d'appliquer la bonne méthode, c'est assez rapide.
 
Ensuite par contre, la lecture des index, les tris, et surtout les regroupements ça bouffe énormément de temps, d'autant plus quand il y a des distinct : une première lecture pour faire un tri temporaire, puis une seconde lecture pour virer les doublons, c'est la mort pour le SGBD. Ensuite, pour la construction du curseur et la récupération des indexes, je pense que ça se passe d'explications, ça extrêment lent, à cause de limitations purement matérielles.


:jap:
Non, je parlais de la 2è étape que tu as décrite ("Ensuite, c'est l'éxécution de la requête" ).


Message édité par sircam le 21-09-2004 à 10:04:04

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
n°854653
Arjuna
Aircraft Ident.: F-MBSD
Posté le 21-09-2004 à 11:01:42  profilanswer
 

Ah ok :) Ben là ça dépends complètement de la requête et de la présence d'indexes ou non :)
Mais à partir du moment où il y a beaucoups de lignes à retourner, c'est dans tous les cas cette l'étape suivante la plus longue.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Comment éviter une division par 0 (zéro) --> résolu par DECODE()

 

Sujets relatifs
insertion de données dans une table sqlMise a jour automatique de table SQL, Help plz...
Pb : You have an error in your SQL syntax ... arghhhhh!Enumérer les entrés d'un CHECK ... IN [Résolu]
[RESOLU] différence $langue et $_SESSION['langue'][Résolu] Un mysql_fetch_object avec un champ texte
Script perl cgi [Resolu]Comment créer des fonctions PL/SQL
Ecriture dans un fichier : erreur de retour à la ligne [résolu][Résolu] Executer du javascript...
Plus de sujets relatifs à : [SQL] Comment éviter une division par 0 (zéro) --> résolu par DECODE()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR