Собирайте накопленные еженедельные продажи с помощью студии управления SQLServer - PullRequest
0 голосов
/ 10 июля 2019

Мой запрос собирает данные о ежедневных продажах технического специалиста.

select
  SUM(O.SUB_TOTAL) AS TOTALSALES,
  COUNT(DISTINCT O.ORDER_NO) AS BILLABLEORDERS
FROM ordhdr o
INNER JOIN schedule s ON s.ID_VAL = o.ORDER_NO
WHERE
  s.DATE = Convert(varchar(10), GETDATE()-1,121)
  AND O.[TYPE] = 'SVC'

Однако я также хочу получать еженедельные кумулятивные продажи, чтобы узнать, отслеживает ли он свои еженедельные показатели или нет, но я изо всех сил пытался преобразовать запрос.

Это нужно сбрасывать для каждого воскресенья или понедельника, поэтому я не могу использовать функцию CurrentDate-7.
Я не знаю, как просматривать только данные за ТЕКУЩИЕ недели с использованием SQL-Server.Студия управления .

1 Ответ

0 голосов
/ 10 июля 2019

Посмотрите на функцию «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

Что даст вам ежедневные, еженедельные и годовые итоги.

...