Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2010, 12h12   #1
Membre Expert
 
Avatar de Harry
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2002
Messages : 1 182
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2002
Messages : 1 182
Points : 1 079
Points : 1 079
Par défaut Problème de soustraction dans sous requete

Bonjour,

J'essaye de calculer les clients qui ont encore du forfait Elearning en cours, donc je fais une sélection de tous les clients ou (total acheté - total dépensé > 0).

Tout va bien quand j'ai un total dépensé > 0

Mais si j'ai un client qui à acheté un forfait mais n'as jamais rien dépensé (donc total dépensé = 0) la soustraction ne se fait pas.

Voici la requete :

Code :
1
2
3
4
SELECT * FROM CLIENTS WHERE 
(SELECT SUM(CMINUTE) FROM CELEARNING WHERE CELEARNING.ID_CLIENT = CLIENTS.ID_CLIENT) - 
(SELECT SUM(DUREE) FROM INTERVENTIONS WHERE INTERVENTIONS.ID_CLIENT = CLIENTS.ID_CLIENT AND INTERVENTIONS.ELEARNING = 'Oui') > 0 
ORDER BY CODE_CLIENT
J'ai déjà essayé de faire un CAST en int de 'SUM(DUREE)' sans succès.

Si j'execute séparément la requête :
Code :
1
2
SELECT SUM(DUREE) FROM INTERVENTIONS WHERE 
INTERVENTIONS.ID_CLIENT = CLIENTS.ID_CLIENT AND INTERVENTIONS.ELEARNING = 'Oui'
ou si vous préférez
Code :
1
2
SELECT SUM(DUREE) FROM INTERVENTIONS WHERE 
INTERVENTIONS.ID_CLIENT = 856 AND INTERVENTIONS.ELEARNING = 'Oui'

et que je le convertis en texte j'obtiens rien et non 0 sur les clients qui n'ont pas eu d'interventions. (donc le retour dois être null au lieu de 0)

Je pense que le problème viens probablement de là. Quelqu'un sait comment je peux contourner ?

Merci,

Harry
__________________

Attention le .NET sur PDA peut causer des chutes de cheveux
Harry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 15h43   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Bonjour,
Quelque chose du genre :
Code :
1
2
3
4
SELECT * FROM CLIENTS WHERE 
(SELECT SUM(CMINUTE) FROM CELEARNING WHERE CELEARNING.ID_CLIENT = CLIENTS.ID_CLIENT) - 
(coalesce (SELECT SUM(DUREE) FROM INTERVENTIONS WHERE INTERVENTIONS.ID_CLIENT = CLIENTS.ID_CLIENT AND INTERVENTIONS.ELEARNING = 'Oui'), 0) > 0 
ORDER BY CODE_CLIENT
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2010, 16h00   #3
Membre Expert
 
Avatar de Harry
 
Homme
Ingénieur développement logiciels
Inscription : juillet 2002
Messages : 1 182
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juillet 2002
Messages : 1 182
Points : 1 079
Points : 1 079
Bonjour Barbibulle et Merci !

COALESCE marche impec

Voici la requète finale :

Code :
1
2
3
4
5
 
SELECT * FROM CLIENTS WHERE 
(SELECT SUM(CMINUTE) FROM CELEARNING WHERE CELEARNING.ID_CLIENT = CLIENTS.ID_CLIENT) - 
COALESCE((SELECT SUM(DUREE) FROM INTERVENTIONS WHERE INTERVENTIONS.ID_CLIENT = CLIENTS.ID_CLIENT AND INTERVENTIONS.ELEARNING = 'Oui'), 0) > 0 
ORDER BY CODE_CLIENT
__________________

Attention le .NET sur PDA peut causer des chutes de cheveux
Harry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 08h40   #4
Membre éprouvé
 
Inscription : janvier 2009
Messages : 297
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 297
Points : 451
Points : 451
Bonjour,

Sans être expert, il me semble que lors de la création de la base ou d'une table, il serait bien de mettre une valeur par défaut 0 pour les colonnes numériques. Ainsi, si aucune donnée n'est saisie, la valeur est zéro au lieu du traditionnel NULL.

Cette approche évite quelques soucis au moment de réaliser une jointure.

Il s'agit juste d'un avis
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 10h03   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Tout dépend si vous avez besoin ou non de savoir qu'une valeur a bien été saisie.

En mettant zéro par défaut, vous ne savez plus si c'est parque l'utilisateur à saisie la valeur zéro ou si c'est qu'il n'a rien saisie.

Je ne comprend pas le rapport de votre seconde remarque avec les jointures ?

De plus cela n'aurait rien changé au problème d'Harry, car ce n'est pas "DUREE" qui renvoi NULL mais l'absence d'enregistrement dans la table INTERVENTIONS pour le client. Du coup le résultat de la requête est NULL.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h55.


 
 
 
 
Partenaires

Hébergement Web