Как выбрать только данные из таблицы, в которой переменная включает строки для getdate () вплоть до конца недели (пятницы) включительно - PullRequest
0 голосов
/ 20 мая 2019

data

У меня есть таблица с товарами, магазинами и прогнозами продаж на каждый день недели.Некоторые дни отсутствуют.Я хочу суммировать ежедневные прогнозы продаж, чтобы получить еженедельный прогноз продаж, но я хочу делать это только там, где сегодня и каждый день с сегодняшнего дня до пятницы включительно присутствует в таблице.Сегодня может быть любой день недели, когда этот код запускается.

Ожидаемый результат будет в следующем формате.Здесь должны присутствовать только те комбинации товаров / магазинов, у которых были строки, существующие на сегодняшний день, вплоть до пятницы в исходной таблице.Недельный прогноз - это сумма всех существующих дней (не только сегодня до пятницы).

1 Ответ

1 голос
/ 21 мая 2019

Я только что создал функцию, которая будет давать вам количество дней до определенного дня недели (@endDay).1 = воскресенье, 2 = понедельник .... 6 = пятница, 7 = суббота.Поэтому в пятницу вы должны передать функцию 6 для @endDay.Вот DDL для создания функции:

-- Note that the logic above is assuming your @@DATEFIRST=7 (this is the default, you can check using `SELECT @@DATEFIRST`. 

CREATE FUNCTION dbo.DaysUntilThisWeekday(@endDay TINYINT, @date DATE)
RETURNS TABLE WITH SCHEMABINDING AS RETURN
SELECT N = ((@endDay+7)-DATEPART(WEEKDAY,@date))%7
WHERE  @endDay BETWEEN 1 AND 7; -- startup predicate, no rows returned otherwise
GO

Вы можете использовать эту функцию для своей таблицы следующим образом (включая примеры данных, которые вы можете запускать локально):

DECLARE @yourTable TABLE (SomeDate DATE);
INSERT @yourTable(SomeDate) VALUES ('20190518'),('20190519'),('20190520'),('20190521'),
          ('20190522'),('20190523'),('20190524'),('20190525'),('20190526'),('20190527')

DECLARE @endDay   TINYINT = 6, -- 6 for Friday
        @startDay DATE    = GETDATE();

SELECT     t.SomeDate
FROM       @yourTable                                 AS t
CROSS JOIN dbo.DaysUntilThisWeekday(@endDay,@startDay) AS f
WHERE      t.SomeDate BETWEEN @startDay AND DATEADD(DAY,f.N,@startDay);

Возвращает:

SomeDate
----------
2019-05-20
2019-05-21
2019-05-22
2019-05-23
2019-05-24

Это все записи между сегодняшним днем ​​и пятницей (включительно).Если вы не можете создать функцию, вы можете просто сделать это:

DECLARE @yourTable TABLE (SomeDate DATE);
INSERT @yourTable(SomeDate) VALUES ('20190518'),('20190519'),('20190520'),('20190521'),
          ('20190522'),('20190523'),('20190524'),('20190525'),('20190526'),('20190527')

DECLARE @startDay DATE = GETDATE();

SELECT t.SomeDate
FROM   @yourTable AS t
WHERE  t.SomeDate BETWEEN @startDay AND 
       DATEADD(DAY,((13)-DATEPART(WEEKDAY,GETDATE()))%7,@startDay);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...