OK.
select p.codpay, p.designation, sum(amounts) ca
from pays p, (
select f.codpay, sum(fl.montantligne) amount
from facture f, facute_ligne fl
where fl.facture_num = f.num
union all
select a.codpay, sum(al.montantligne) * -1 amount
from avoir a, avoir_ligne al
where al.facture_num = a.num
) eve
where eve.codpay =* p.codpay
group by codpay |
PS: Je te conseille de faire une vue "v_evenement", ça sert généralement pas mal...
select 'F' typeve, f.codpay, f.num, sum(fl.montantligne) amount
from facture f, facute_ligne fl
where fl.facture_num = f.num
union all
select 'A' typeve, a.codpay, a.num, sum(al.montantligne) amount
from avoir a, avoir_ligne al
where al.facture_num = a.num
Avec d'autres infos (client, produits, etc.)
PS: t'as le choix dans la requête entre un champ 'typeve' contenant 'F' ou 'A' selon facture ou avoir, ou alors, multiplier par -1 les montants d'avoir.
Je préfère la première solution, car tu n'est jamais à l'abris de données négatives dans les tables, et ça peut baiser les calcules entre la vue et des extracts bruts.
Dans l'absolu, cette vue "evenement" ne devrait pas être une vue, mais la table unique qui gère factures et avoirs.
Sur l'ERP sur lequel je travail, on a :
EVE : entêtes des factures, commandes, livraisons, etc.
EVL : lignes
EVP : "postes" (sous-lignes, par exemple, chaque envois d'une partie d'une ligne pour un typeve = 'LIV')
PS: pour le =* , je sais plus s'il est du bon côté. En tout cas, met-le : c'est pas parcequ'aujourd'hui tous les pays ont des lignes que ce sera toujours vrai.
Message édité par MagicBuzz le 10-03-2004 à 11:09:32