Je précise que je débute en MS-SQL. Voici mon problème:
J'ai deux tables:
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).
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
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:
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 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
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 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
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
Partager