В целях отчетности я изо всех сил пытаюсь получить некоторые таблицы в формате, который можно легко сгруппировать и агрегировать в инструменте отчетов (SSRS).
Я использую SQL Server 2014
Iиметь следующие таблицы: (для примера показаны даты, но на самом деле это даты и времени)
tblEvents
datetimestamp prio
----------------------------------
2018-05-20 4
2018-08-05 1
2018-11-12 3
2018-11-13 1
Который нужно «пересэмплировать» в tblCalendar, который представляет собой таблицу интервалов с равным интервалом с настраиваемым значением @start_datetime,@end_date, @number_of_intervals, которые мне уже удалось сделать с помощью CTE:
tblCalendar
datefrom dateto
----------------------------------
1900-01-01 2018-04-12
2018-04-12 2018-05-31
2018-05-31 2018-07-19
2018-07-19 2018-09-06
2018-09-06 2018-10-25
2018-10-25 2018-12-13
2018-12-13 2100-01-01
Желаемый результат:
datefrom dateto prio
-------------------------------------------
1900-01-01 2018-04-12 -1
2018-04-12 2018-05-31 4
2018-05-31 2018-07-19 4
2018-07-19 2018-09-06 1
2018-09-06 2018-10-25 1
2018-10-25 2018-12-13 3
2018-12-13 2100-01-01 3
Для каждой строки tblCalendar столбец prio должен бытьдобавить согласно:
IF between [datefrom] en [dateto] 1 or more datetimestamp present in tblEvents
take MAXIMUM of prio's between [datefrom] en [dateto]
ELSE
IF before [date1] 1 or more datetimestamp present in tblEvents
take LAST prio between [datefrom] en [dateto]
ELSE
IF after [date2] 1 or more datetimestamp present
take FIRST prio between [datefrom] en [dateto]
ELSE
prio unknown = -1
END
END
END
Так что я бы описал проблему как условную агрегацию.
Я довольно новичок в SQL и пытался исправить это с помощью подзапросов, условных объединений и т. Д., Но не могу заставить его работать.Код ниже моя текущая попытка.
SELECT
datefrom,
dateto,
MAX(Case
When ((datetimestamp >= datefrom) AND (datetimestamp <= dateto)) Then prio
When ((datetimestamp <= datefrom)) Then 'last-known-prio'
When ((datetimestamp > dateto)) Then 'first future-prio'
Else
-1 -- no prio known ever
End),
FROM tblCalendar CROSS JOIN tblEvents
Буду признателен за любую помощь и мысли.