Having avec plusieurs conditions
Résolu
mika0931
-
moderno31 Messages postés 872 Date d'inscription Statut Membre Dernière intervention -
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 :
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
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:
- Sql having 2 conditions
- Supercopier 2 - Télécharger - Gestion de fichiers
- 2 ecran pc - Guide
- Faire 2 colonnes sur word - Guide
- Whatsapp 2 - Guide
- Mise en forme conditionnelle excel plusieurs conditions - Guide
20 réponses
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 ?
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 ?
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
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
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.
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.
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
Te tracasse pas, je vais essayer de trouver une solution.
Merci beaucoup pour ton aide.
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..
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..
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
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
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 ??
Si c'est pas le cas, tu verras des null
Quel SGBD rappele moi ??
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.
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.
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.
Je viens aussi de tester une sous-requête, même problème.
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 ??
Tu peux me détailler ce que tu attends de cette requête et qu'elle ne fait pas ??
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.
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.
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
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
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.
Je viens de lancer la requête, je te dis le résultat qd elle est finit.
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
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
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é
Je voulais dire que le langage SQL devrait évoluer pour éviter ce genre de soucis.
Avec le distinct, aucun client n'est renvoyé
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é.
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é.