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 Firebird Discussion :

Problème de soustraction dans sous requete


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 224
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Bonjour,
    Quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre éprouvé
    Avatar de Harry
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 224
    Par défaut
    Bonjour Barbibulle et Merci !

    COALESCE marche impec

    Voici la requète finale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    591
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 591
    Par défaut
    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

  5. #5
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    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.

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

Discussions similaires

  1. Problèmes de calcul dans une requete imbriquée
    Par LeNovice dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/03/2007, 16h56
  2. problème d'apostrophe dans mes requetes
    Par kirian dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/05/2006, 12h06
  3. [débutant] problème de condition dans une requete
    Par banker dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 13h52
  4. [VBA-E]problème de date dans une requete
    Par isa21493 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 24/02/2006, 11h45
  5. Problème de soustraction dans un champ
    Par Tyraelina dans le forum Access
    Réponses: 1
    Dernier message: 18/12/2005, 17h18

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