Этот вопрос действительно сбил меня с толку, потому что я не мог придумать простого решения для него. Черт.
Лучшее, чем я мог управлять, - это абсолютная ложь следующих действий: вы создали временную таблицу, вставили в нее «Периоды», присоединились к исходной таблице и сгруппировали ее.
Предположим, что в вашей таблице содержимого есть следующее
ID int
Date DateTime
Counter int
И вы пытаетесь сложить все counter
за шесть месяцев
DECLARE @min_date datetime
select @min_date = min(date) from test
DECLARE @max_date datetime
select @max_date = max(date) from test
DECLARE @today_a datetime
DECLARE @today_b datetime
set @today_a = getdate()
set @today_b = getdate()
CREATE TABLE #temp (startdate DateTime, enddate DateTime)
WHILE @today_a > @min_date
BEGIN
INSERT INTO #temp (startDate, endDate) VALUES (dateadd(month, -6, @today_a), @today_a)
SET @today_a = dateadd(month, -6, @today_a)
END
WHILE @today_b < @max_date
BEGIN
INSERT INTO #temp (startDate, endDate) VALUES (@today_b, dateadd(month, 6, @today_b))
SET @today_b = dateadd(month, 6, @today_b)
END
SELECT * FROM #temp
SELECT
sum(counter),
'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' + Convert(nvarchar(10), enddate, 121) as Period
FROM test t
JOIN #Temp ht
ON t.Date between ht.startDate AND ht.EndDate
GROUP BY
'Between ' + Convert(nvarchar(10), startdate, 121) + ' => ' + Convert(nvarchar(10), enddate, 121)
DROP TABLE #temp
Я действительно надеюсь, что кто-то может найти лучшее решение, которое мой мозг явно растаял.