Je précise que je débute en MS-SQL. Voici mon problème:

J'ai deux tables:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
actifs
actif_id	portf_id	prod_id	date_deb	val_tot
1		1		1		2013-04-15	100.000
2		1		1		2013-04-16	200.000
3		2		1		2013-04-14	150.000
4		1		2		2013-04-15	100.000
5		2		3		2013-04-20	120.000
6		1		3		2013-04-30	100.000
 
transac_hist
 
transac_id	actif_id	date_trans		trans_mnt
1		1		2013-05-15		-1000
2		2		2013-05-15		-2000
3		3		2013-05-15		 3000
4		1		2013-05-30		-1000
5		2		2013-05-30		-1500
6		3		2013-05-30		-1000
7		1		2013-06-15		-6000
8		2		2013-06-15		 5000
9		3		2013-06-15		-1000
10		4		2013-06-20		-1000
Je dois obtenir la valeur totale d'un portefeuille donné (une ligne par actif) à une date donnée (à savoir en ajoutant le cumul des transactions à la valeur totale pour un produit donné, ces montants, s'ils existent pouvant être positifs ou négatifs).

Si:

- aucune transaction n'existe dans transac_hist pour un actif donné ou
- aucune transaction pour une date inférieure ou égale n'existe dans transac_hist pour un actif donné

alors les lignes de(s) (l')actif(s) correspondants doivent être présentes dans le jeu de résultat mais afficher
- 0 pour le montant de transaction
- la valeur totale de l'actif d'origine pour le total en cours


Le jeu de résultat doit se présenter ainsi:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
actif_id	prod_id 		date_deb	val_tot	montant transaction total en cours
1		1			2013-04-15	100.000	-1000	99.000
2		1			2013-04-16	200.000 -2000	198.000
4		2			2013-04-15	100.000 0		100.000
6		3			2013-04-30	100.000 0		100.000
Le SELECT suivant donne les actifs pour lesquels aucune transaction n'existe mais - et pour cause - pas ceux dont les transactions ont une date supérieure (et donc n'entrent pas dans les critères du select.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT 
a.actif_id,
a.prod_id,
a.date_deb,
a.val_tot,
sum(coalesce(th.trans_mnt,0)) as 'montant transaction',
(a.val_tot + sum(coalesce(th.trans_mnt,0))) as 'total en cours'
FROM actifs a
LEFT OUTER JOIN transac_hist th
ON a.actif_id = th.actif_id
WHERE a.portf_id = 1
AND coalesce(th.date_trans, a.date_deb) <= '2013-05-15'
GROUP BY a.actif_id, a.prod_id, a.date_deb, a.val_tot
ORDER BY a.actif_id
Par contre le select suivant me donne le résultat escompté mais je suis persuadé qu'il y a plus simple comme solution, aussi vos lumières sont les bienvenues. Vraiment, merci d'avance:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SELECT 
a.actif_id,
a.prod_id,
a.date_deb,
a.val_tot as 'total en cours'
FROM actifs a
LEFT OUTER JOIN transac_hist th
ON a.actif_id = th.actif_id
WHERE a.portf_id = 1
AND a.actif_id NOT IN
(SELECT a.actif_id
FROM actifs a
INNER JOIN transac_hist th
ON a.actif_id = th.actif_id
WHERE a.portf_id = 1
AND at.trans_date <= '2012-05-15')
GROUP BY a.actif_id, a.prod_id, a.date_deb, a.val_tot
UNION
SELECT 
a.actif_id,
a.prod_id,
(a.val_tot  + sum(th.trans_mnt,0)) as 'outstanding_amount'
FROM asset a
INNER JOIN transac_hist th
ON a.actif_id = th.actif_id
WHERE a.portf_id = 1
AND coalesce(th.date_trans, a.date_deb) <= '2013-05-15'
GROUP BY a.actif_id, a.prod_id, a.date_deb, a.val_tot