sql - 在值为零的情况下返回标称值时出错
问题描述
下面的代码块在大多数情况下都能完美运行。问题是我正在尝试为特定行“注入”标称值,而该行不存在任何值...
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 的实例:好的,因为实际上没有,但这会导致报告出现问题。
在这种情况下,我要做的就是为 state=160 的 1 秒创建一个标称值。
我认为 CASE 语句可以实现这一点,但是 CASE 语句当然没有 state=160 的实例来捕获......
解决方案
选择列表中的逗号不起作用。
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
换行应该可行。
推荐阅读
- android-studio - 如何在不转到 xml 文件的情况下为 android studio 中的按钮提供名称和 ID?
- mysql - 触发以验证房间容量
- r - 如何计算 R 中的 ker(A) / 零空间
- vue.js - Vue Template 中的匿名函数是性能杀手吗?
- hibernate - Cascade ALL 不为儿童组合生成 id
- python - python中缺少值的统计信息
- android - 使用 OkHttp 客户端执行原始 graphQL 查询
- java - Kafka Streams并行处理不起作用
- python - /Service /usr/bin/chromium-browser 处的 WebDriverException 意外退出。状态码是:127
- flutter - 如何使 InputDecoration 边框仅出现在左侧?