Ошибка при возврате номинального значения в случае, когда значение равно нулю - PullRequest
0 голосов
/ 17 мая 2019

Блок кода ниже работает отлично по большей части. Проблема в том, что я пытаюсь «ввести» номинальное значение для конкретной строки, для которой не существует значения ...

  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 ...

1 Ответ

0 голосов
/ 17 мая 2019

Запятые в вашем списке выбора не будут работать.

CASE WHEN SUM(TimeInState) < 1 THEN 1 ELSE SUM(TimeInState) END AS [CumulativeTimeSec] --Comma missing
CumulativeTime = CONVERT(varchar(10), DATEADD(SECOND, SUM(TimeInState), 0), 108), -- extra Comma

Обмен строк должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...