Пример таблицы
create table mytable(id int, dt datetime, cost money)
insert mytable values
(1,GETDATE()-10,200),
(1,GETDATE()-40,204),
(1,GETDATE()-100,200),
(1,GETDATE()-200,201);
Запрос с использованием специального синтаксиса SQL Server 2008 и правильно отсортированный
select
t.id [to],
CONVERT(char(3),dateadd(month,-M.N,L.PVT),7) [Month],
sum(t.cost) totalCost
from (select PVT=dateadd(month,datediff(month,0,getdate())-1,0)) L
cross join (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) M(N)
left join mytable t
on t.dt >= dateadd(month,-M.N,L.PVT)
and t.dt < dateadd(month,-M.N+1,L.PVT)
group by t.id, right(CONVERT(char(9),dt,6),6), M.N, L.PVT
order by M.N
Что он делает:
right(CONVERT(char(9),dt,6),6)
преобразует дату в формат «ДД МММ ГГ», нам нужна только MMM YY
часть
- В SELECT мы дополнительно извлекаем из него только трехзначный месяц, используя LEFT (, 3)
- Подзапрос L содержит одну запись и столбец PVT, который является первой датой последнего месяца
- Ряд чисел 0-11 используется для создания значений месяцев за последние 12 месяцев по формуле
dateadd(month,-M.N,L.PVT)
- Диапазон
t.dt >= .. and t.dt < ..
находит данные за один месяц