[SQL] "outer join" et "sum", "min": requête problematique

"outer join" et "sum", "min": requête problematique [SQL] - SQL/NoSQL - Programmation

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
Reply

Marsh Posté le 22-01-2004 à 16:03:46   

Reply

Marsh Posté le 22-01-2004 à 16:23:39    

left outer join au lieu de right outer join ?


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

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 !

Reply

Marsh Posté le 22-01-2004 à 16:36:06    

allé c pas grave pense a ce soir  [:______ from ppc]

Reply

Marsh Posté le 22-01-2004 à 16:44:02    

Goueg a écrit :

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? :)


Essaie ça :

Citation :

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) or achat.num_cli is null
GROUP BY client.num_cli


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

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 > [:yaisse]
 
tomlameche > c presque bon :jap:
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à :)


Message édité par goueg le 22-01-2004 à 17:14:44
Reply

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)

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed