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

  1. #1
    Membre actif Avatar de grinder59
    Inscrit en
    septembre 2005
    Messages
    700
    Détails du profil
    Informations forums :
    Inscription : septembre 2005
    Messages : 700
    Points : 210
    Points
    210

    Par défaut Difficulté avec Having

    Bonjour,

    Je dispose de 2 tables :
    Facture et Règlements

    A chaque facture peut correspondre 0, n règlements.
    Un règlement peut être désactivé et donc il ne doit pas être pris en compte.

    En une requête, je voudrais compter le nombre de facture dont le reste à payer est 0.

    Pour le moment j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    	COUNT(DISTINCT f.factureID) 
    FROM 
    	reglement r INNER JOIN
    	facture f ON r.factureID = f.factureID
    GROUP BY 
    	f.factureID
    HAVING 
    	((f.total - SUM(CASE WHEN r.actif = 0 THEN 0 ELSE r.montant END)) = 0)
    Bon en réalité, ma requête est un poil plus compliquée car elle lie 15 tables, mais il y a l'essentiel ci-dessus.
    Le résultat est une erreur indiquant que f.total n'est pas connu.

    j'avais essayé de faire le calcul dans la clause WHERE mais j'avais également une erreur du fait de la somme (j'ai cherché et trouvé que lorsqu'il y une somme dans un WHERE il fallait passer par un HAVING)

    Auriez-vous une piste ?

    Merci de votre aide !

  2. #2
    Membre actif
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : mai 2008
    Messages : 129
    Points : 222
    Points
    222

    Par défaut

    Que contient la colonne actif ?

    Quelques suggestions :
    En supposant que actif prenne seulement deux valeurs 0 ou 1, ou qu'il soit de type de boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT COUNT(f.factureID)
    FROM facture f
    INNER JOIN (
        SELECT factureID, actif*SUM(montant) total
        FROM reglement
        GROUP BY factureID
    ) r ON r.factureID = f.factureID
    WHERE f.total = r.total;
    Sinon faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT COUNT(f.factureID)
    FROM facture f
    INNER JOIN (
        SELECT factureID, SUM(IF( actif = 0, 0, montant)) as total
        FROM reglement
        GROUP BY factureID
    ) r ON r.factureID = f.factureID
    WHERE f.total = r.total;
    Il faudra tester la performance des alternatives suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(IF( actif = 0, 0, montant))
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(CASE WHEN actif = 0 THEN 0 ELSE montant END)

Discussions similaires

  1. [JS] Difficulté avec le onmouseover...
    Par Pleymo dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 26/11/2005, 12h09
  2. [VBA] difficultés avec une requête INSERT
    Par elias dans le forum Access
    Réponses: 7
    Dernier message: 06/09/2005, 14h53
  3. REQUETE SQL AVEC HAVING
    Par juju_77 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 05/08/2005, 09h49
  4. Difficultés avec - onchange - !
    Par zakuli dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 20/07/2005, 12h00
  5. Difficultés avec TMenuItem.OnDrawItem
    Par ybruant dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/01/2005, 11h07

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