Trop dure pour moi (Requete SQL niveau 5 sur l'échelle de Richter)

Trop dure pour moi (Requete SQL niveau 5 sur l'échelle de Richter) - SQL/NoSQL - Programmation

Marsh Posté le 14-02-2005 à 22:42:11    

Voila je souhaite faire un datareport en vb mais c'est la requete SQL qui coince.
 
Les tables
 
J'utilise 3 tables : cd, emprunt, client.
La table CD a : numcd, nomcd, nbexemplaire, datesortie, prix_location.
La table Emprunt a : numemprunt, dateemprunt, numclt.
La table client a : numclt, nomclt, prenomclt, adrclt.
 
Les relations (dsl c a chier)
entre cd et emprunt on a : cd <=> 0,n <=>emprunter<=> 1,n <=> emprunt
entre emprunt et client on a : emprunt <=> 1,1 <=> passer <=>1,n<=>clien
 
On ne peut pas emprunter 2 même cd(même numéro cd, même nom) dans un même emprunt.
 
la requete
Je souhaiterai avoir le nom et prenom des clients avec le nombre d'emprunt qu'ils ont effectué (au total) et le montant de tous leurs emprunts.
 
J'espère être clair si c'est pas le cas, hurler contre moi et demander des précisions !!
 
Merci au boss du SQL qui va me trouvé ca et bonne chance  :na: !!

Reply

Marsh Posté le 14-02-2005 à 22:42:11   

Reply

Marsh Posté le 14-02-2005 à 22:54:26    

salut,
 
c pas si compliqué que ca :
deja commence par ajouter les colonnes numcd et numclt dans Emprunt. ca va etre plus facile  ;)
 
[edit] heu c pas moi le boss SQL [/edit]


Message édité par sonikbuzz le 14-02-2005 à 22:55:22
Reply

Marsh Posté le 14-02-2005 à 22:58:29    

numclt est deja dedans et suivant les cardinalités tu peu pa avoir numcd dans emprunt. Et j'ai besoin d'une base en troisieme forme normale, c'est pour le boulot !!

Reply

Marsh Posté le 14-02-2005 à 23:19:07    

Il faut rajouter une table intermédiaire entre CD et Emprunt, qui correspond à ta relation "emprunter", et qui contient l'identifiant de la relation, càd "numcd" et "numemprunt".


Message édité par dividee le 14-02-2005 à 23:19:27
Reply

Marsh Posté le 14-02-2005 à 23:20:36    

ah oui pardon je l'avais oublié elle existe dejà !! Mais c'est la requete qui ramène beaucoup de truc de partout je suis embrouillé, j'y arrive plus !!

Reply

Marsh Posté le 14-02-2005 à 23:32:14    

un truc genre:


select
    cl.nomclt, cl.prenomclt, count(*) as nbr_emprunt, sum(prix_location) as montant_total
from client cl
    inner join emprunt e on cl.numclt = e.numclt
    inner join cd_emprunt cde on e.numemprunt = cde.numemprunt
    inner join cd on cde.numcd = cd.numcd
group by
    cl.numclt


 
J'ai pas testé mais ça doit ressembler à ça (faut peut-être rajouter des champs dans la clause 'group by' suivant le SGBD). En gros, tu joins toutes tes tables, tu regroupes par client, et tu aggrèges ce qu'il faut.
edit: qqes typos


Message édité par dividee le 14-02-2005 à 23:37:49
Reply

Marsh Posté le 14-02-2005 à 23:39:57    

j'essairai demain là jvai aller me coucher !! :D

Reply

Marsh Posté le 14-02-2005 à 23:41:31    

le nbr_emprunt ce serait plutôt

count(distinct e.numemprunt)

sinon ça donne le nombre de CD empruntés, pas le nombre d'emprunt...

Reply

Marsh Posté le 15-02-2005 à 20:11:48    

ca a pas lair de marcher !! et au passage inner join jai jamais vu !!

Reply

Marsh Posté le 15-02-2005 à 21:31:13    

tout dépend de l'SGBD que tu utilises
tu peux faire ça différemment bien sure...
 
 
select client.nomclt, client.prenomclt, count(DISTINCT *) as nbr_emprunt, sum(prix_location) as montant_total  
from client, emprunt, cd_emprunt, cd  
where client.numclt = emprunt.numclt  
AND emprunt.numemprunt = cd_emprunt.numemprunt  
AND cd_emprun.numcd = cd.numcd  
group by client.numclt  

Reply

Marsh Posté le 15-02-2005 à 21:31:13   

Reply

Marsh Posté le 15-02-2005 à 21:41:24    

jvai tenter ca cette requete !!
Pour les prochains (si jamais ca marche pas), la base de données est sous access!

Reply

Marsh Posté le 15-02-2005 à 22:03:05    

pourquoi je m'échine sur ce truc j'ai l'impression qu'on parle pas le meme langage !!

Reply

Marsh Posté le 16-02-2005 à 20:37:04    

cmt ça?

Reply

Marsh Posté le 17-02-2005 à 12:14:06    

bah tout simplement ca marche pas !! et ca ménerve !! il comprend que les "select *" basique dès qu'on lui met plus de trucs il panique et ne marche plus

Reply

Marsh Posté le 17-02-2005 à 21:27:52    

Access accepte parfaitement la syntaxe 'inner join' (avec qqes parenthèses en plus), mais par contre le count(distinct ...) il ne connait pas.
Ceci fonctionne (j'ai testé):


select  
    cl.nomclt, cl.prenomclt, ee.nbr_emprunt, sum(prix_location) as montant_total  
from (((client cl  
    inner join emprunt e on cl.numclt = e.numclt)
    inner join cd_emprunt cde on e.numemprunt = cde.numemprunt)
    inner join cd on cde.numcd = cd.numcd)
    inner join (select numclt, count(*) as nbr_emprunt from emprunt group by numclt) ee on ee.numclt = cl.numclt
group by  
    cl.numclt, cl.nomclt, cl.prenomclt, ee.nbr_emprunt


C'est le moyen le plus simple que j'ai trouvé, mais qq'un d'autre trouvera peut-être une solution encore plus simple.

Reply

Marsh Posté le 01-03-2005 à 21:24:26    

merci dividee pour le inner join meme si ca va etre dur a expliquer pour mon projet
par contre jai un dernier petit souci comment on met le [Résolu] sur le titre ?? :P

Reply

Marsh Posté le 02-03-2005 à 10:37:32    

faut éditer le premier message :)
http://forum-images.hardware.fr/themes_static/images/defaut/edit.gif

Reply

Sujets relatifs:

Leave a Replay

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