Блок кода ниже работает отлично по большей части. Проблема в том, что я пытаюсь «ввести» номинальное значение для конкретной строки, для которой не существует значения ...
DECLARE @ReportTimeStart DATETIME = '2019-05-10 06:59:00'
DECLARE @ReportTimeEnd DATETIME = '2019-05-10 23:01:00'
;
--The "WITH" block returns a list of the total time spent in the state for each event in the list from the sub-query
WITH StateTimes AS
(
SELECT
[tbl_tg_machinestate_ndx],
[Machine_State],
DATEDIFF(second, [t_stamp], NextStateTime) AS TimeInState
FROM
(
--This sub-query block ("SQ") returns a list of start and end times for each event. NULL value in the last recrd is replaced with the report end time.
SELECT
[tbl_tg_machinestate_ndx],
[Machine_State],
[t_stamp],
ISNULL(LEAD([t_stamp]) OVER (ORDER BY [tbl_tg_machinestate_ndx]), @ReportTimeEnd) NextStateTime
FROM [db_SPE_Carrig].[dbo].[tbl_TG_MachineState]
WHERE [t_stamp] BETWEEN @ReportTimeStart AND @ReportTimeEnd
) SQ
)
--This final query returns an aggregated list of total time spent in each state over the report duration
SELECT
[Machine_State],
CASE WHEN SUM(TimeInState) < 1 THEN 1 ELSE SUM(TimeInState) END AS [CumulativeTimeSec],
CumulativeTime = CONVERT(varchar(10), DATEADD(SECOND, SUM(TimeInState), 0), 108)
FROM
StateTimes
GROUP BY
[Machine_State]
ORDER BY
[Machine_State]
Внутренний запрос в блоке WITH производит данные, выглядящие так:
_ndx Machine_State t_stamp NextStateTime
10211 170 2019-05-10 07:03:46.883 2019-05-10 07:03:48.087
10212 110 2019-05-10 07:03:48.087 2019-05-10 07:04:02.123
10213 120 2019-05-10 07:04:02.123 2019-05-10 07:04:07.333
Весь блок WITH создает такую таблицу:
_ndx Machine_State TimeInState
10211 170 2
10212 110 14
10213 120 5
10214 130 20
Для каждого экземпляра каждого отдельного состояния вычисляется разница во времени.
Последний шаг заключается в агрегировании этой таблицы и суммировании всех экземпляров каждого состояния следующим образом:
Machine_State CumulativeTimeSec CumulativeTime Description
100 6728 01:52:08 Safeties Down
110 464 00:07:44 Initialising
120 93 00:01:33 Ready to Start
130 14986 04:09:46 Running
140 1405 00:23:25 Dwell
150 161 00:02:41 Stopped
170 33597 09:19:57 Faulted
Проблема в том, что у меня нет экземпляра для состояния 160: Хорошо, потому что на самом деле его нет, но это вызывает проблемы с отчетом.
В этом сценарии все, что я хочу сделать, - это создать номинальное значение для состояния = 160, равное 1 секунде.
Я думал, что оператор CASE достигнет этого, но, конечно, для захвата оператора CASE нет экземпляра состояния = 160 ...