PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → SQL division par 0
SQL division par 0
Débuté par guchon13, 29 nov. 2005 13:51 - 9 réponses
Posté le 29 novembre 2005 - 13:51
Bonjour a tous,

voici ma requete SQL
SELECT
STATS.TROIS_PTS_OK / (STATS.LF_KO + STATS.LF_OK) * 100 AS POURCENTAGE_TROIS
FROM EQUIPE, MATCH, STATS
WHERE EQUIPE.ID_EQUIPE = MATCH.ID_EQUIPE
AND MATCH.ID_MATCH = STATS.ID_MATCH

Elle ne fonctionne pas lorsque
(STATS.LF_KO + STATS.LF_OK) = 0


je suppose que le problème vient du fait que je veux diviser par 0

Comment dois je procéder pour que cela focntionne ?

il n'existe pas une commade CASE :
select CASE
when (STATS.LF_KO + STATS.LF_OK) = 0 then 0
when (STATS.LF_KO + STATS.LF_OK) > 0 then STATS.TROIS_PTS_OK / (STATS.LF_KO + STATS.LF_OK) * 100

ou une fonction ISNULL(valeur, valeur si nulle, valeur si non nulle)

Merci de votre aide ...
Posté le 29 novembre 2005 - 15:15
Merci Pierre d'avoir pris le temps de me repondre.
Mais si je fais ce que vous dites, la ligne n'apparait pas or je veux qu'elle s'affiche...avec par exemple des ZEROS

il ne s'agit pas d'une clause, mais juste de modifier l'affichage du select en cas de tentative de division par zero ...

Je ne sais si j'ai été clair ...
Posté le 29 novembre 2005 - 15:51
WHERE (STATS.LF_KO + STATS.LF_OK)>0


"Laurent" <guchon13@hotmail.com> a écrit dans le message de news:
438c4866@news.pcsoft.fr...

Bonjour a tous,

voici ma requete SQL
SELECT
STATS.TROIS_PTS_OK / (STATS.LF_KO + STATS.LF_OK) * 100 AS
POURCENTAGE_TROIS
FROM EQUIPE, MATCH, STATS
WHERE EQUIPE.ID_EQUIPE = MATCH.ID_EQUIPE
AND MATCH.ID_MATCH = STATS.ID_MATCH

Elle ne fonctionne pas lorsque
(STATS.LF_KO + STATS.LF_OK) = 0


je suppose que le problème vient du fait que je veux diviser par 0

Comment dois je procéder pour que cela focntionne ?

il n'existe pas une commade CASE :
select CASE
when (STATS.LF_KO + STATS.LF_OK) = 0 then 0
when (STATS.LF_KO + STATS.LF_OK) > 0 then STATS.TROIS_PTS_OK /
(STATS.LF_KO + STATS.LF_OK) * 100

ou une fonction ISNULL(valeur, valeur si nulle, valeur si non nulle)

Merci de votre aide ...
Posté le 29 novembre 2005 - 16:47
Pourquoi pas lancer la requête suivante et calculer après en utilidant du code :

SELECT
STATS.TROIS_PTS_OK ,STATS.LF_KO ,STATS.LF_OK)
FROM EQUIPE, MATCH, STATS
WHERE EQUIPE.ID_EQUIPE = MATCH.ID_EQUIPE
AND MATCH.ID_MATCH = STATS.ID_MATCH


if STATS.LF_KO + STATS.LF_OK<>0 then
POURCENTAGE_TROIS = STATS.TROIS_PTS_OK / (STATS.LF_KO + STATS.LF_OK) * 100
else
POURCENTAGE_TROIS = 0
endif
Posté le 29 novembre 2005 - 17:17
Il s'agit d'une base hyperfile sous SYBASE un select case ferait l'affaire ou select isnull()

Quant à la reponse de WALTER C, j'utilise cette requete dans une table, je choisi donc les champs de la requete a afficher, je ne sais donc pas si je peux modifier et recalculer de nouvelles valeurs...

J'essaie !

Merci a vous deux
Posté le 29 novembre 2005 - 17:34
c quoi comme base (sql server ?)

"Laurent" <guchon13@hotmail.com> a écrit dans le message de news:
438c5c31$1@news.pcsoft.fr...


Merci Pierre d'avoir pris le temps de me repondre.
Mais si je fais ce que vous dites, la ligne n'apparait pas or je veux
qu'elle s'affiche...avec par exemple des ZEROS

il ne s'agit pas d'une clause, mais juste de modifier l'affichage du
select en cas de tentative de division par zero ...

Je ne sais si j'ai été clair ...


Posté le 29 novembre 2005 - 17:35
Bonjour,
Effectivement le Case existe mais sous SQLserver (Pour les autres bases je ne sais point).

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

pour le ISNULL ( check_expression , replacement_value )

SELECT
STATS.TROIS_PTS_OK / ISNULL((STATS.LF_KO + STATS.LF_OK), 1) * 100 AS POURCENTAGE_TROIS
FROM EQUIPE, MATCH, STATS
WHERE EQUIPE.ID_EQUIPE = MATCH.ID_EQUIPE
AND MATCH.ID_MATCH = STATS.ID_MATCH


sinon une autre possiblité et de pacer par un
select ..... (les cas non null avec un test sur la somme <> 0)
UNION
select .... (Les cas égaux à 0)

@+
Posté le 29 novembre 2005 - 19:19
SELECT CASE WHEN STATS.LF_KO + STATS.LF_OK = 0 THEN 0 ELSE
STATS.TROIS_PTS_OK / (STATS.LF_KO + STATS.LF_OK) * 100 END AS
POURCENTAGE_TROIS

"Laurent" <guchon13@hotmail.com> a écrit dans le message de news:
438c78ab$1@news.pcsoft.fr...

Il s'agit d'une base hyperfile sous SYBASE un select case ferait l'affaire
ou select isnull()

Quant à la reponse de WALTER C, j'utilise cette requete dans une table, je
choisi donc les champs de la requete a afficher, je ne sais donc pas si je
peux modifier et recalculer de nouvelles valeurs...

J'essaie !

Merci a vous deux


Posté le 30 novembre 2005 - 10:32
Philip a écrit :
Bonjour,
Effectivement le Case existe mais sous SQLserver (Pour les autres bases je ne sais point).

sous Mysql (4.1.10a) ça fonctionne très bien :
select case when num_poste='b' then 'caisse B' else 'caisse A' end from
ticket where datfct='20051129'


--
Jacques Trepp
Albygest - 81160 - St Juery
jacques-pas de spam.trepp@free.fr
(enlever '-pas de spam' pour me joindre)
http://www.albygest.com
Posté le 30 novembre 2005 - 19:44
Merci a tous,
mais le isnull ou le case ne fonctionne pas sous HYPERFILE ou je l'ai mal ecrit

Quand au fait d'utiliser le UNION, le probleme c'est que j'ai une multitude de division ...

commment puis je faire ...je suis toujours coincié !!



Merci pour votre aide !