MSSQL 2008. Я пытаюсь создать оператор SQL, который возвращает сумму столбца B
для всех строк, где столбец A
находится между 2 известными диапазонами. Диапазон представляет собой скользящее окно, и его следует пересчитать, так как он может использовать цикл.
Вот пример того, что я пытаюсь сделать, очень упрощенный из моей реальной проблемы. Предположим, у меня есть эти данные:
Таблица: Тест
Year Sales
----------- -----------
2000 200
2001 200
2002 200
2003 200
2004 200
2005 200
2006 200
2007 200
2008 200
2009 200
2010 200
2011 200
2012 200
2013 200
2014 200
2015 200
2016 200
2017 200
2018 200
2019 200
Я хочу построить запрос, который возвращает 1 строку за каждое десятилетие в приведенной выше таблице, например:
Желаемые результаты:
DecadeEnd TotalSales
--------- ----------
2009 2000
2010 2000
Где в первом ряду указаны все продажи за 2000–2009 годы, а во втором - 2010–2019 годы. DecadeEnd - это скользящее окно, которое перемещается вперед на установленное количество для каждой строки в наборе результатов. Чтобы проиллюстрировать это, я могу сделать это одним из способов, используя цикл:
declare @startYear int
set @startYear = (select top(1) [Year] from Test order by [Year] asc)
declare @endYear int
set @endYear = (select top(1) [Year] from Test order by [Year] desc)
select @startYear, @endYear
create table DecadeSummary (DecadeEnd int, TtlSales int)
declare @i int
-- first decade ends 9 years after the first data point
set @i = (@startYear + 9)
while @i <= @endYear
begin
declare @ttlSalesThisDecade int
set @ttlSalesThisDecade = (select SUM(Sales) from Test where(Year <= @i and Year >= (@i-9)))
insert into DecadeSummary values(@i, @ttlSalesThisDecade)
set @i = (@i + 9)
end
select * from DecadeSummary
Возвращает нужные мне данные:
DecadeEnd TtlSales
----------- -----------
2009 2000
2018 2000
Но это очень неэффективно. Как я могу построить такой запрос?