Je commencerais par construire une table de nombres contenant des entiers séquentiels de 1 à un million environ. Ils sont très utiles une fois que vous avez compris.
Par exemple, voici comment obtenir le 1er de chaque mois en 2008 :
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12;
Maintenant, vous pouvez assembler cela en utilisant OUTER APPLY pour trouver la transaction la plus récente pour chaque date comme ceci :
with Dates as (
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12
)
select d.firstOfMonth, t.TransactionValue
from Dates d
outer apply (
select top 1 TransactionValue
from Transactions
where TransactionDate <= d.firstOfMonth
order by TransactionDate desc
) t;
Cela devrait vous donner ce que vous cherchez, mais vous devrez peut-être chercher un peu sur Google pour trouver le meilleur moyen de créer le tableau des nombres.