Как отображать данные по скользящим дням в течение трех месяцев, когда данные имеют отметку даты для изменения состояния по столбцам

#sql-server #date

#sql-сервер #Дата

Вопрос:

У меня есть данные в таком формате:

ID Дата Создания Дата начала работы Дата В Процессе Дата Завершения Разработки Дата Завершения Теста Дата Принятия
1 2021-11-01 12:01:15 2021-11-02 14:01:15 2021-11-04 05:01:15 2021-11-04 12:01:15 2021-11-05 12:01:15 2021-11-06 12:01:15
2 2021-11-01 12:01:45 нулевой 2021-11-03 12:01:15 нулевой нулевой 2021-11-05 12:01:15
3 2021-11-03 11:11:05 2021-11-04 12:01:15 нулевой нулевой нулевой нулевой
4 2021-11-05 19:31:45 2021-11-05 12:01:15 2021-11-06 12:01:15 нулевой нулевой нулевой
5 2021-11-04 13:21:25 нулевой нулевой нулевой нулевой нулевой

и мне нужно, чтобы он был отформатирован вот так:

Дата Созданный Готовы к началу в процессе Разработка Завершена Тест Завершен Принято
2021-11-01 2 0 0 0 0 0
2021-11-02 0 1 0 0 0 0
2021-11-03 1 0 1 0 0 0
2021-11-04 0 1 1 1 0 0
2021-11-05 1 1 0 0 1 1
2021-11-06 0 0 1 0 0 1

с переходящими датами, начиная с 3 месяцев с текущей даты.

Я не уверен, с чего это начать… Буду ли я объединять рекурсивную таблицу, создающую скользящий календарь, с существующими данными, или я сделаю серию пользовательских выборок для подсчетов, а затем сгруппирую по дате?

Комментарии:

1. Создайте свой 3-месячный период, а затем присоединитесь к нему.

Ответ №1:

Попробуйте что-нибудь вроде этого:

 DECLARE @Today date = GetDate(); DECLARE @MinDate date = DateAdd(month, -3, @Today); DECLARE @DayCount int = 1   DateDiff(day, @MinDate, @Today);  WITH cteNumbers As (  /* Use a tally-table here if you have one: */  SELECT TOP (@DayCount)  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) As N  FROM  sys.all_columns ), cteCalendar As (  SELECT  DateAdd(day, N, @MinDate) As [Date],  DateAdd(day, N   1, @MinDate) As NextDay  FROM  cteNumbers ) SELECT  C.[Date],  (  SELECT Count(1)   FROM YourTable As T   WHERE T.[Date Created] gt;= C.[Date]  And T.[Date Created] lt; C.NextDay  ) As [Created],  (  SELECT Count(1)   FROM YourTable As T   WHERE T.[Date Ready to Start] gt;= C.[Date]  And T.[Date Ready to Start] lt; C.NextDay  ) As [Ready to Start],  ... FROM  cteCalendar As C ;