Посмотрите на функцию «DatePart». Вы можете использовать его, чтобы определить, какая неделя в году принадлежит данной дате, и она, кажется, переворачивается в воскресенье. Например:
datepart(week, '2019-07-06') -- Saturday, returns 27
datepart(week, '2019-07-07') -- Sunday, returns 28
Это само по себе должно помочь вам. Однако вы можете добавить еще несколько приемов, чтобы получить всю информацию в одном наборе результатов.
Рассмотрим следующую таблицу ordhdr:
declare @ordhdr table (
order_no int,
sub_total decimal(8,2),
type varchar(15)
);
insert @ordhdr values
(1, 23.25, 'svc'),
(2, 324.23, 'svc'),
(3, 423.89, 'svc'),
(4, 324.80, 'svc'),
(5, 234.23, 'svc'),
(6, 923.23, 'svc');
... и следующая таблица расписаний:
declare @schedule table (id_val int, date date);
insert @schedule values
(1, '2019-07-04'),
(2, '2019-07-04'),
(3, '2019-07-08'),
(4, '2019-07-09'),
(5, '2019-07-09'),
(6, '2019-07-10');
Итак, используя datepart, datename, cross apply и группировки, вы можете сделать это:
select ap.year,
ap.weekOfYear,
dayOfWeek =
case
when ap.weekOfYear is null then '<entire year>'
when ap.dayOfWeek is null then '<entire week>'
else ap.dayOfWeek
end,
s.date,
totalsales = sum(o.sub_total),
billableorders = count(distinct o.order_no)
from @ordhdr o
join @schedule s on s.id_val = o.order_no
cross apply (select
year = datepart(year, s.date),
weekOfYear = datepart(week, s.date),
dayOfWeek = datename(weekday, s.date)
) ap
where o.type = 'svc'
group by grouping sets (
(ap.year, ap.weekOfYear, ap.dayOfWeek, s.date),
(ap.year, ap.weekOfYear),
(ap.year)
)
order by weekOfYear, date
Что даст вам ежедневные, еженедельные и годовые итоги.