Вот решение, которое использует DATEADD & DATEPART для вычисления ближайшего воскресенья.
С поправкой на другую настройку @@datefirst
.
(Поскольку значения дня недели в части даты отличаются в зависимости от настройки DATEFIRST)
Пример данных:
create table #TestTable
(
Id int identity(1,1) primary key,
[Date] date,
Val int
);
insert into #TestTable
([Date], Val)
VALUES
('2020-01-01', 1)
, ('2020-01-02', 3)
, ('2020-01-05', 2)
, ('2020-01-07', 8)
, ('2020-01-13', 3)
;
Запрос:
WITH CTE_DATA AS
(
SELECT [Date], Val
, DATEADD(day,
((7-(@@datefirst+datepart(weekday, [Date])-1)%7)%7),
[Date]) AS Sunday
FROM #TestTable
)
SELECT
Sunday AS [Date],
SUM(Val) AS [Sum]
FROM CTE_DATA
GROUP BY Sunday
ORDER BY Sunday;
Date | Sum
:--------- | --:
2020-01-05 | 6
2020-01-12 | 8
2020-01-19 | 3
db <> fiddle здесь
Дополнительно:
Очевидно, хитрость добавления разницы недель от дня 0 до дня 6 также работает независимо от настройки DATEFIRST.
Таким образом, этот запрос вернет тот же результат для данных примера.
WITH CTE_DATA AS
(
SELECT [Date], Val
, CAST(DATEADD(week, DATEDIFF(week, 0, DATEADD(day, -1, [Date])), 6) AS DATE) AS Sunday
FROM #TestTable
)
SELECT
Sunday AS [Date],
SUM(Val) AS [Sum]
FROM CTE_DATA
GROUP BY Sunday
ORDER BY Sunday;
Вычитание 1 дня гарантирует, что если дата уже воскресенье, то она не рассчитывается до следующего воскресенья.