Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como determinar valores para meses ausentes com base em dados de meses anteriores em T-SQL


Eu começaria construindo uma tabela Numbers contendo inteiros sequenciais de 1 a um milhão ou mais. Eles são muito úteis quando você pega o jeito.

Por exemplo, aqui está como obter o primeiro dia de cada mês em 2008:
select firstOfMonth = dateadd( month, n - 1, '1/1/2008')
from Numbers
where n <= 12;

Agora, você pode juntar isso usando OUTER APPLY para encontrar a transação mais recente para cada data da seguinte forma:
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;

Isso deve fornecer o que você está procurando, mas talvez seja necessário pesquisar um pouco no Google para encontrar a melhor maneira de criar a tabela Numbers.