[SQL]Problème requête simple: jointure externe

Problème requête simple: jointure externe [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 05-06-2008 à 09:01:43    

Salut les gars, je suis un pauvre fonctionnel qui essaie de faire des rapports SQL et ma connaissance en SQL est limitée.
Je vous explique le problème:
 
J'ai une table A avec une liste de région (champ CODE)
J'ai une table B avec des montants en cours, et chaque ligne porte un code région, donc on peut simplifier en disant que la table porte (CODE, EN_COURS) comme champ
J'ai une table C avec des montants facturés, et chaque ligne porte aussi un code région: (CODE, FACT)
Une région peut avoir 0 à n lignes dans la table B, et 0 à n lignes dans la table C.
 
Mon but est d'obtenir la liste des régions avec une colonne portant la somme des en cours sur la région, et une autre portant la somme des facturés sur la région
 
Je suis donc parti de ma table A, puis jointure externe sur les tables B et C, group by(A.CODE) et sum(B.EN_COURS) et sum(C.FACT).
 
Ma premirèe colonne me donne un résultat correct, mais la deuxième me donne un résultat muliplié par le nombre de lignes de la première partie de ma requête: problème typique de jointure.
 
J'espère que vous pourrez me dépanner, car la je sèche.
 
Merci  :jap:

Reply

Marsh Posté le 05-06-2008 à 09:01:43   

Reply

Marsh Posté le 05-06-2008 à 13:36:12    

Avec quel type de base de données (Oracle, Access, MySQL, SL server, Sybase, ...) ?
La syntaxe varie d'une base à l'autre quand on veut faire des choses un tout petit peu compliquées.
 
Comme vous avez deux sum à faire sur des tables pouvant avoir des cardinalités différentes (on peut avoir FACT sans ENCOURS ou l'inverse (peut-être uniquement dans des cas exceptionnels), si j'ai bien compris), il faudrait faire deux requêtes séparées, qui seront éventuellement réunies en une seule.
 
Par exemple, on pourrait tenter :

Select A.CODE,
       (select sum(B.ENCOURS) from B where B.CODE = A.CODE group by B.CODE),
       (select sum(C.FACT)    from C where C.CODE = A.CODE group by C.CODE)
from A


Message édité par olivthill le 05-06-2008 à 13:37:40
Reply

Marsh Posté le 05-06-2008 à 15:22:23    

Je suis en fait sur SQL server.
J'ai réussi à avoir ce que je voulais grace à la commande UNION ALL, assez pratique, mais je vais essayer votre proposition :)

Reply

Marsh Posté le 10-06-2008 à 22:02:44    

j'aurais fait ca avec un union all aussi pour le coup, genre
 
select code, sum(encours), sum(fact)
from (
select code, 0 as encours, 0 as fact
from A
union all
select code, encours, 0
from B
union all
select code, 0, fact) T
group by code


Message édité par HappyHarry le 10-06-2008 à 22:02:58
Reply

Marsh Posté le 10-06-2008 à 23:35:59    

on peut enchainer les union all?ou faut il les imbriquers les uns dans les autres?

Reply

Marsh Posté le 10-06-2008 à 23:55:08    

tu peux les enchainer tant que tu veux

Reply

Marsh Posté le 11-06-2008 à 11:29:00    

ok merci :)

Reply

Marsh Posté le 11-06-2008 à 17:50:36    

vous avez rien trouvé de plus dégueux comme solutions ? :o

Reply

Marsh Posté le 11-06-2008 à 19:08:40    

tu proposes quoi? [:cosmoschtroumpf]

Reply

Sujets relatifs:

Leave a Replay

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