Having avec plusieurs conditions

Résolu
mika0931 -  
moderno31 Messages postés 900 Statut Membre -
Bonjour,

J'ai une requête qui ne me renvoi pas les bonnes valeurs.
Celle-ci permet de récupérer les identifiants clients dont le Chiffre d'affaire dépasse 3000€, qui possèdent plus de 10 avoirs et habitant en Espagne :

SELECT o.customers_id 
FROM customers c 
INNER JOIN orders o on c.customers_id = o.customers_id 
INNER JOIN orders_total ot ON o.orders_id = ot.orders_id 
INNER JOIN customers_balance_history cbh on c.customers_id = cbh.customers_id 
WHERE 1 and o.customers_country LIKE "%Spain%" and ot.title = "Total:" 
GROUP BY o.customers_id, o.customers_name, c.customers_email_address, o.customers_country
HAVING SUM(ot.value) > 3000 and count(cbh.customers_id) > 10 
ORDER BY o.date_purchased ASC 


Aucune des 2 conditions contenu dans le HAVING ne sont remplies....
Cette requête est générée dans du code PHP.

Merci d'avance pour votre aide.

Mika

20 réponses

  1. moderno31 Messages postés 900 Statut Membre 92
     
    Hello
    Il me semble que ton having devrait se baser sur des colonnes somme/ou/moyenne... de ton select

    Un truc du genre
    SELECT o.customers_id
    ,SUM(ot.value)
    ,count(cbh.customers_id)
    FROM customers c
    INNER JOIN orders o on c.customers_id = o.customers_id
    INNER JOIN orders_total ot ON o.orders_id = ot.orders_id
    INNER JOIN customers_balance_history cbh on c.customers_id = cbh.customers_id
    WHERE 1 and o.customers_country LIKE "%Spain%" and ot.title = "Total:"
    GROUP BY o.customers_id, o.customers_name, c.customers_email_address, o.customers_country
    HAVING SUM(ot.value) > 3000 and count(cbh.customers_id) > 10
    ORDER BY o.date_purchased ASC

    Précision : quand tu exécute ta requête de base sans mes modifs, ya erreur ou pas ? Quoi exactement ?
    0
  2. mika0931
     
    Merci de ta réponse,

    Non je n'ai pas d'erreur mais les résultats renvoyés sont erronées, plusieurs clients ont un count(cbh.customers_id) inférieur à 10.

    Je vais tester en rajoutant le SUM et le count dans le SELECT.

    Encore merci
    0
  3. moderno31 Messages postés 900 Statut Membre 92
     
    Es-tu sur un volume de données important ?
    Si oui prend un échantillon. si faut ta requête est mal ficelée par rapport aux données que tu attaques.
    Mais si ya pas d'erreur, fait gaffe à tes jointures... C'est aussi une source de production d'erreurs en cascade.
    0
  4. mika0931
     
    Il y a 150 000 clients dans la base de données, ceux concernés par un CA > 3000 et habitant en Espagne sont environ 80.

    Quand je rajoute la condition count(cbh.customers_id) > 10, j'en un peu moins au lieu d'en avoir 3 ou 4 qui on plus de 10...

    Dans ce cas les jointures ont l'air correcte, je lis bien les bonnes tables entres elles, je me trompe peut être..

    Je teste ta requête.

    Ecore merci.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mika0931
     
    J'ai le même soucis en rajoutant les colonnes dans le select.
    Te tracasse pas, je vais essayer de trouver une solution.

    Merci beaucoup pour ton aide.
    0
  7. moderno31 Messages postés 900 Statut Membre 92
     
    Tu fais un COUNT ok mais sur quoi ?

    Parce que j'ai l'impression que quand tu passes par orders_total et customers_balance_history tu récupères des doublons.

    donc essaye de poser un distinct quelque part..
    0
  8. mika0931
     
    Je fais un count sur la table customers_balance_history.
    Je passe par la table orders_total pour obtenir le Chiffre d'Affaire des clients.
    Tu dois avoir surement raison pour les doublons, je vérifie ça de suite.

    J'essaye avec un distinct
    0
  9. moderno31 Messages postés 900 Statut Membre 92
     
    Et je passerais par left join pour vérifier si toutes les jointures se font..
    Si c'est pas le cas, tu verras des null
    Quel SGBD rappele moi ??
    0
  10. mika0931
     
    MySql, et je bosse avec Oscommerce.
    0
  11. mika0931
     
    Tu avais raison, il me renvoi des nombres astronomiques d'avoirs pour chaque clients.

    La requête que j'ai posté au tout début me permet de récupérer les ids clients concernés par les différents critères.

    Ensuite j'utilise une seconde requête qui me permet de sélectionner les champs que je veux pour les clients renvoyés dans la première...

    La requête est bonne mais le count(cbh.customers_id) ne l'est pas.

    Je vais essayer un distinct.
    0
  12. mika0931
     
    Avec un distinct, cela ne marche pas, j'ai le même résultat.
    Je viens aussi de tester une sous-requête, même problème.
    0
  13. moderno31 Messages postés 900 Statut Membre 92
     
    Malheureusement je n'ai pas de moyen de tester avec toi et de faire du pas à pas.
    Tu peux me détailler ce que tu attends de cette requête et qu'elle ne fait pas ??
    0
  14. mika0931
     
    En fait la table CUSTOMERS_BALANCE_HISTORY contient tous les avoirs accordés aux clients.
    Un client peut avoir plusieurs avoirs donc son id peut être présent plusieurs fois dans la table CUSTOMERS_BALANCE_HISTORY.
    Je compte donc le nombre de fois que chaque ID client apparaît.

    Je veux obtenir les id clients qui résident en Espagne, qui cumule plus de 3000€ d'achat (SUM(ot.total)) et qui ont plus de 10 avoirs.
    0
  15. moderno31 Messages postés 900 Statut Membre 92
     
    Essaye un count(distinct cbh.customers_id)...?
    Sinon je ne sais pas davantage.
    Parce qu'en une seule requête pour faire ça c'est chaud.

    Le count classique va sommer tout ce qu'il trouve comme ligne. On ajuste ce nombre de ligne en filtrant en retirant les null par exemple et des fois on ne veut remonter/compter une seule fois les lignes d'un meme sujet.

    Ton sujet = cbh.customers_id
    Count (distinct sujet) différent de select distinct sujet
    Moderno31
    0
  16. mika0931
     
    Faudrait modifier ça dans SQL, quand tu veux compter le nombre d'occurence d'un ID dans une table, il devrait se limiter à cette table, en plus on le précise dans le code : "cbh.".

    Je viens de lancer la requête, je te dis le résultat qd elle est finit.
    0
  17. moderno31 Messages postés 900 Statut Membre 92
     
    non non justement, il y a des jointures.
    Ta table est dépendante du niombre de lignes jointures compriseS...

    Je n'ai jamais bien compris ce mystère. Je croyais comme toi ...apparement non
    Si pas jointures oui sinon faut passer par count distinct

    j'espère que ça t'aide
    0
  18. mika0931
     
    Je savais ça mais si tu mets pas les jointures, ça fausse tout.
    Je voulais dire que le langage SQL devrait évoluer pour éviter ce genre de soucis.

    Avec le distinct, aucun client n'est renvoyé
    0
  19. moderno31 Messages postés 900 Statut Membre 92
     
    Bon je ne sais pas t'aider alors. Désolé.
    Fait du pas à pas. Retire toutes les jointures exécute, puis vérifie les clauses where puis exécute et ajoute les jointures unes à unes puis exécute.

    Ya forcément un truc tu as loupé.
    0
  20. mika0931
     
    C'est la dernière solution. En tout cas merci beaucoup pour ton aide et le temps que tu as pris pour m'aider.

    Bonne continuation
    0
  21. moderno31 Messages postés 900 Statut Membre 92
     
    Pas de souci.
    Tu sais où me joindre. Sinon tous les autres collègues du forum t'aideront
    0