"outer join" et "sum", "min": requête problematique [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 22-01-2004 à 16:23:39
left outer join au lieu de right outer join ?
Marsh Posté le 22-01-2004 à 16:26:52
Enleve ton where (achat.int_reste > 0) et tes clients dont la somme des int_reste = 0 apparaitra !
Marsh Posté le 22-01-2004 à 16:44:02
Goueg a écrit : Salut,
|
Essaie ça :
Citation : SELECT client.num_cli, MIN(achat.date_expiration) AS date_min, SUM(achat.int_reste) AS reste_tot |
Marsh Posté le 22-01-2004 à 17:04:10
merci pour vos réponses,
bill > non, c bien un right dans mon cas
agagax > certes mais les clients dont la somme n'existe pas n'apparaissent toujours pas (clients n'ayant pas passé d'achat)
mrmat >
tomlameche > c presque bon
Il reste un cas qui pose problème, c'est quand un client est bien présent dans la table achat, mais que la date d'expiration a été atteinte ou que int_reste vaut 0 >> il n'apparait pas dans le résultat de la requête.
En clair si (achat.date_expiration > { fn NOW() } AND achat.int_reste > 0) échoue mais que le client est bien présent dans la table achat, c pas bon...
Mais bon on s'approche là
Marsh Posté le 22-01-2004 à 18:35:30
Et avec ça en clause where ? :
WHERE (achat.date_expiration > { fn NOW() } OR achat.date_expiration is null)
Marsh Posté le 23-01-2004 à 10:18:41
bon là en fait ca fait plus ce qu'il faut: date_expiration, c'est la prochaine date d'expiration qui va faire expirer des unités (int_reste).
donc en faisant comme ca date_expiration indiquerait la prochaine date d'expiration sans tenir compte du fait que ce soit la date a laquelle 0 unités expirent.
Marsh Posté le 22-01-2004 à 16:03:46
Salut,
Soit la base de données
CLIENT > num_cli
ACHAT > num_cli (etrangere), date_expiration, int_reste
Je voudrais afficher pour chaque client son solde d'unités restantes encore valides.
J'ai fait ca:
SELECT client.num_cli, MIN(achat.date_expiration) AS date_min, SUM(achat.int_reste) AS reste_tot
FROM achat RIGHT OUTER JOIN
client ON achat.num_cli = client.num_cli
WHERE (achat.date_expiration > { fn NOW() }) AND (achat.int_reste > 0)
GROUP BY client.num_cli
et j'obtiens...
num_cli date_min reste_tot
4 20/02/2004 11:43:00 150
Bon les données sont correctes mais si j'ai fait un OUTER JOIN c'était pour avoir une logne de résultat pour chaque client, de ce type:
num_cli date_min reste_tot
1 <null> 0
2 <null> 0
3 <null> 0
4 20/02/2004 11:43:00 150
Et du coup, je vois pas comment faire, vu que les fonctions min() et sum() éliminent les lignes correspondant à un client n'ayant fait aucun achat...
Vous auriez une idée?
Message édité par goueg le 22-01-2004 à 16:07:06