Bonjour,
Je travaille sur 1 table (que j'appellerai ici "ventes") comprenant les champs suivants:
- Date_transaction
- ID_client
- ID_transaction
- montant_transaction (la PK est constituée de date de transaction + ID transaction).
Je cherche à relever la liste de toutes les dernières transactions pour chaque client.
Je pars donc sur un code comme ceci :
Ici, je crée une seconde table en partant de ventes avec seulement l'ID_client et la dernière date de transaction, pour récupérer avec l'inner join une table avec les dernières transactions de chaque client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Select t1.* FROM ventes t1 INNER JOIN (Select t1.ID_client, MAX(t1.Date_transaction) as DerniereDate from ventes t1 group by t1.ID_client) t2 ON t1.ID_client= t2.ID_client AND t1.Date_transaction = t2.DerniereDate
Le problème, c'est que s'il y a 2 dernières transactions pour un client à la même date, les 2 lignes apparaissent dans le tableau de résultat. Je cherche alors à ne garder dans ce cas précis seulement celle des deux lignes qui a le plus gros montant de transaction.
Je suis parti sur cette solution :
Ici, j'ai mis tout le code précédent en With et ajouté un filtre where pour garder les lignes où le montant de transaction pour chaque client est supérieur ou égal à tous les autres du même client.
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 WITH temptable AS (SELECT t1.* FROM ventes t1 INNER JOIN (SELECT t1.ID_Client, MAX(t1.Date_Transaction) AS DerniereDate FROM ventes t1 GROUP BY t1.ID_Client ) t2 ON t1.ID_Client = t2.ID_Client AND t1.Date_Transaction = t2.DerniereDate) SELECT * FROM temptable m1 WHERE montant_transaction >= ALL ( SELECT montant_transaction from temptable m2 where m1.ID_client = m2.ID_client );
Ca marche, ça fait le job, mais ça ressemble plus à une astuce qu'à réellement une résolution de problème.
Ma question est, est-ce que je suis parti trop loin avec le With et est-ce qu'il y a possibilité de faire ça plus simplement et plus proprement avec une requête imbriquée dans le where ?
Je vous remercie.
Partager