#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 ;