Jointures des tables et regroupement des données

AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009 - 29 avril 2009 à 10:36
AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009 - 7 mai 2009 à 19:53
bonjour..
j'ai 02 tables access:
1. banque, contient les champs suivant : code, fournisseur, crédit
2. charges, contient les champs suivant : code, fournisseur, montant

je voudrais faire la somme des crédits de la table banque du fournisseur x
et la somme des montants de la table charges du même fournisseur
genre (GROUP BY )
et mettre tout ca dans une troisième table appelée récap
sachant que j’ai plusieurs fournisseurs soit dans la table banque ou dans la table charges, les deux tables sont liées par le champ code
quelqu’un peut m'aider a trouver le sql qui règle ce problème.

merci d'avance

<!-- / message -->
<!-- sig -->




Abed_H

11 réponses

LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 avril 2009 à 15:10
Salut,
tu passes d' abord par une requete incluant les deux tables,
et dans laquelle tu sélectionnera fournisseur, credit, montant.
Reste à savoir quelle sera la propriété de la relation.
Pour celà tu dois répondre à la question:
Est-ce qu' un fournisseur peut avoir un crédit et pas de charge ou l' inverse ?
La réponse déterminera de quelle table sera extrait le champ fournisseur.
Deux possibilité alors:
-Soit :banque.Fournisseur, banque.credit, IIF(IsNull(charges.montant),0,charges.montant)
-Soit :charges.Fournisseur, chatres.montant, IIF(IsNull(banque.credit),0,banque.credit).


C' est après que tu pourras faire ,l à partir de cette requete, le regroupement sur fournisseur pour avoir la somme de credit et la somme de montant.




       
<hr />



[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009
29 avril 2009 à 15:53
Salut,

un fournisseur peut avoir plusieurs crédits.banque et plusieurs montants.charges, je voudrais avoir des enregistrements dans la troisième table
comme ceci
code       Somme_montants        Somme_credits
  x                 1000                             1500
  y                 1500                             2000
  z                 3000                             3000
ect........

et merci encore.
Abed_H
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 avril 2009 à 16:23
"..un fournisseur peut avoir plusieurs crédits.banque
et plusieurs montants.charge"


Pris indépendament, d' acc !


Mais là puisque les deux vont être mises en relation.
La question est :
Est-ce qu'un fournisseur peut avoir des crédits sans avoir de charges ?
Est-ce qu'un fournisseur peut avoir des charges sans avoir de crédits ?
Ou bien:
S' il a une charge, il a forcément un crédit ? (ou inversement)


De ceci dépendera le type de correspondance qu' il y' aura entre les deux tables.


Quand tu dis :
code  Somme_montants  Somme_credits


Puisque le champ code éxiste dans les deux tables, la requete doit savoir de la quelle des deux elle va extraire ce champ ci.




      
<hr />



[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009
29 avril 2009 à 16:42
Re,
peut être j'ai mal exposé le pb
voilà exemple : un fournisseur peut avoir cinq (5) crédits et peut avoir aussi huit (8) charges donc là je voudrais la somme des cinq (5) crédits et la somme de huit (8) montants a part du meme fournisseur. et en passe au deuxieme fournisseur ect... j'usqu'a la fin 
pour ce qui est du  code Somme_montants        Somme_credits     c'est les noms des champs de la troisieme table.
j'espère que j'étais clair maintenant.

Merci 

Abed_H
0

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

Posez votre question
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 avril 2009 à 17:05
"..un fournisseur peut avoir cinq (5) crédits et
peut avoir aussi huit (8) charges"
Encore une fois, t' a spas répondu à la question !


Est-ce qu' un fournisseur peut avoir cinq (5) crédits et
peut avoir aussi nulle charge ?
Est-ce qu' un fournisseur peut avoir nul crédit et
peut avoir aussi huit (8) charges ?


A supposer que l' on fait selon l' exemple)
-une première requete pour avoir la somme des CINQ crédits.
-une deuxère requete pour avoir la somme des HUIT chargess.
-Une troisième requete dans laquelle on lie la première avec la deuxième,
pour avoir la somme des CINQ crédits et la somme des HUIT charges.
De la quelle des deux on va tirer le champ fournisseur ?





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 avril 2009 à 17:33
Une solution cependant:
Si tu as une table fournisseurs, fais une première requete pour avoir la somme des crédits de chaque fournisseurs et une deuxième pour avoir la somme des charges de chaque fournisseur.
Dans une requete avec les trois,lies ta table fournissurs à ses deux requetes .Propriété de chaque liaison:Tous de la table fournisseurs.
Et extrait:


-le champ fournisseur de la table fournisseurs.
-la somme des crédits de la première requete.
-la somme des charges de la deuxière requete.

      
<hr />


[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
29 avril 2009 à 17:59
Autre solution:
Fais une requete UNION:
"SELECT code, fournisseur, credit, 0 AS montant FROM credit " & _
"UNION SELECT code, fournisseur, 0 AS credit, montant FROM charges;"


Puis fais une requete regroupement sur cette requete pour avoir code, somme de credit, somme de charge.





<hr />




[] Ce qui va sans dire. va mieux en le disant.


<hr />
0
alcyde01 Messages postés 10 Date d'inscription vendredi 19 octobre 2007 Statut Membre Dernière intervention 4 décembre 2010
30 avril 2009 à 14:54
<meta http-equiv= "Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 10" />
<meta name="Originator" content="Microsoft Word 10" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso" />
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]-->
<style>
<!--
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:36.0pt;
mso-footer-margin:36.0pt;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Tableau Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
table.MsoTableGrid
{mso-style-name:"Grille du tableau";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
border:solid windowtext 1.0pt;
mso-border-alt:solid windowtext .5pt;
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-border-insideh:.5pt solid windowtext;
mso-border-insidev:.5pt solid windowtext;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1035"/>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1"/>
</o:shapelayout></xml><![endif]-->

Bonjour,





tu peux y
certainement y arriver en faisant plusieurs opérations et en stockant les résultats
intermédiaires, mais pourquoi se passer de la puissance de SQL ?  Ton problème serait résolu en une seule requête,
mais pour cela il faudrait que ta base de données soit bien structurée, ce qui
n’est pas le cas de l’exemple que tu donnes. Si tu veux faire un regroupement
par fournisseur il faut impérativement que tous les fournisseurs soient présents
dans une des tables ce dont on ne peut être sûr avec tes tables actuelles (d’où
les questions de libre Max au sujet des fournisseurs avec ou sans crédit/charge).





Mon conseil est
donc de commencer par revoir la structure de ta base de données ; c’est un
peu contraignant, mais crois-moi ca aura beaucoup d’avantages si tu veux faire évoluer
ton application dans le futur, et puis c’est mieux de faire les choses comme
elles doivent être faites :






 







-

Si tu as peu de champs, et tu veux faire
simple, tu peux te limiter a une seule table :






 





Fournisseur

,
Code

,
Crédit

,
Montant

,

----

 

,

 

,

 

,

 




 






Lors de la saisie
ton application mettra à jour la colonne crédit/montant appropriée et laissera
l’autre à 0. Le code correspondra à la colonne mise
à
jour (si dans ton exemple
le code se rapporte
à
l’opération ; je n’ai pas bien compris).





Cde SQL pour avoir
les sommes par fournisseur :





SELECT table4.fournisseur, Sum(table4.credit)
AS SommeDecredit, Sum(table4.Montant) AS SommeDeMontant





FROM
table4





GROUP
BY table4.fournisseur;






 







-

Si tu as plusieurs champs relatifs au
fournisseur (tel,adresse …), ou tu veux te familiariser avec les BDD
relationnelles , tu peux faire :






 







 





Table
fournisseurs(table1)

,

 

,
Table Données(table2)

,

----

Id

,
Fournisseur

,
Tel

,
Adresse

,

 

,
IdFournisseur

,
Code

,
Crédit

,
Montant

,

----

<!--[if gte vml 1]><v:line id ="_x0000_s1026" style= 'position:absolute;
z-index:1;mso-position-horizontal:absolute;
mso-position-horizontal-relative:text;mso-position-vertical:absolute;
mso-position-vertical-relative:text' from="18pt,4.65pt" to="279pt,4.65pt"
coordsize="21600,21600" strokecolor="red">
<v:stroke endarrow="block"/>
</v:line><![endif]-->
<!--[if !vml]-->
<!--[endif]-->

1

,

 

,

 

,

,

 

,

1

,

 

,

 

,

 

,

----

2

,

 

,

 

,

 

,

,

2

,

 

,

 

,

 

,

----

<!--[if gte vml 1]><v:line id="_x0000_s1033" style='position:absolute;
z-index:8;mso-position-horizontal:absolute;
mso-position-horizontal-relative:text;mso-position-vertical:absolute;
mso-position-vertical-relative:text' from="18pt,11.05pt" to="18pt,39.55pt"
coordsize="21600,21600" strokecolor="navy"/><![endif]-->
<!--[if !vml]-->

3

,

 

,

 

,

 

,

,

2

,

 

,

 

,

 

,

----

 

,

 

,

 

,
<!--[if gte vml 1]><v:line id="_x0000_s1032" style='position:absolute;
z-index:7;mso-position-horizontal-relative:text;
mso-position-vertical-relative:text' from="27.6pt,5.25pt" to="126.6pt,5.25pt"
coordsize="21600,21600" strokecolor="red">
<v:stroke endarrow="block"/>
</v:line><![endif]-->
<!--[if !vml]-->

<!--[endif]-->,

 

,

1

,

 

,

 

,

 

,

----

,

 

,

 

,

,

 

,

3

,

 

,

 

,

 




 






La contrainte est
que si tu veux ajouter un crédit/montant
à
un fournisseur, ce dernier doit
exister dans la table des fournisseurs. C'est
à
ton application de le gérer.






 






Cde SQL pour avoir
les sommes par fournisseur :





SELECT Table1.Id, Sum(Table2.Crédit)
AS SommeDecredit, Sum(Table2.Montant) AS SommeDeMontant





FROM  Table1 LEFT JOIN Table2 ON Table1.Id = Table2.IdFournisseur





GROUP BY Table1.Id;






 






En espérant que ça
fasse avancer le SCHMILBLIK …..
0
AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009
4 mai 2009 à 10:12
Bonjour et merci beaucoup š€ vous deux
ce code m'a donnšŠ exactement le ršŠsultat escomptšŠ mais seulement j'aurais pršŠfšŠrer que la somme des montants soit dans une colonne et la somme des cršŠdits dans une autre colonne en face.

Code   ©Š   SommeDecredit     ©Š      SommeDeMontant

Sub Main()
Dim strConn As ADODB.Connection
Dim rstBq As ADODB.Recordset    'code banques
Set strConn = New ADODB.Connection
        MaDb = "D:\GestRecettes\Base.mdb"
        strConn = "driver={Microsoft Access Driver (*.mdb)};dbq=" & MaDb
        strConn.Open
Set rstBq = New ADODB.Recordset
rstBq.Open "SELECT code,Sum(dšŠpense) AS SommeDecredit from mvtsbanques group by code " & _
           "UNION SELECT code,Sum(Montant) AS SommeDeMontant From charges group by code ", strConn, 1, 3


Feuil1.Range("A1").CopyFromRecordset rstBqSet rstBq Nothing: Set strConn Nothing
End Sub
 

Bonne journšŠe.


Abed_H
0
LIBRE_MAX Messages postés 1402 Date d'inscription mardi 1 mai 2007 Statut Membre Dernière intervention 7 octobre 2012 6
5 mai 2009 à 11:07
"SELECT code, Sum(dšŠpense) AS SommeDecredit, 0 AS SommeDeMontant from mvtsbanques group by code " & _
           "UNION SELECT code, 0 AS SommeDecredit, Sum(Montant) AS SommeDeMontant From charges group by code "
<hr />

[] Ce qui va sans dire. va mieux en le disant.

<hr />
0
AH60 Messages postés 20 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 7 mai 2009
7 mai 2009 à 19:53
Bonjour et merci  LIBRE_ MAX
c'est à ce moment là que j'ai compris ta solution, c'est exactement que je cherchais merci encore une fois
bonne journée
Abed_H
0
Rejoignez-nous