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

Requêtes MySQL Discussion :

Difficulté avec Having


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    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
    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)

  3. #3
    Membre actif
    Merci de ton aide, problème résolu !