Having avec plusieurs conditions

Résolu
mika0931 -  
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   -
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

A voir également:

20 réponses

moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
mika0931
 
MySql, et je bosse avec Oscommerce.
0
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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   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
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
moderno31 Messages postés 872 Date d'inscription   Statut Membre Dernière intervention   92
 
Pas de souci.
Tu sais où me joindre. Sinon tous les autres collègues du forum t'aideront
0