sql - 以所需格式格式化结果集时出现问题

标签 sql sql-server t-sql formatting

我的设备安装在具有不同区域 ID 的不同位置,我将按以下格式每小时返回不同区域的设备事件状态。

AreaId  |   UpdatedOn             | DeviceStatus
  1     | 2018-08-08 00:00:00.000 | Active
  1     | 2018-08-08 01:00:00.000 | Active
  1     | 2018-08-08 02:00:00.000 | Active
  2     | 2018-08-08 00:00:00.000 | Inactive
  2     | 2018-08-08 01:00:00.000 | Active
  2     | 2018-08-08 02:00:00.000 | Active
  3     | 2018-08-08 00:00:00.000 | Active
  3     | 2018-08-08 01:00:00.000 | Inactive
  3     | 2018-08-08 02:00:00.000 | Inactive

可以清楚地看到,设备 1 始终处于事件状态。设备 2 在 00:00 到 01:00 期间未处于事件状态 设备 3 在 01:00 到 02:00 以及 02:00 到 03:00 期间未处于事件状态。

我想以以下格式显示此数据。

2018 年 8 月 8 日 0:00 至 03:00 的设备状态

Areaid     | Status
1          | Active
2          | Not Active between 00:00 hrs to 01:00 hrs
3          | Not Active between 01:00 hrs to 02:00 hrs and  02:00 hrs to 03:00 hrs

适用于所有区域。

我怎样才能实现这个目标?

最佳答案

您可以尝试使用STUFF子查询中的函数获取 DeviceStatus = 'Inactive'行数据,则 outer join基于AreaId

SELECT t2.AreaId, coalesce(Status,'Active') Status
FROM (
    SELECT distinct AreaId,DeviceStatus,
           STUFF((
             SELECT ' and ' + CONVERT(VARCHAR(5),UpdatedOn,108) + ' hrs' + ' to ' + CONVERT(VARCHAR(5),DATEADD(HOUR,1,UpdatedOn),108) + ' hrs'
             FROM T tt
             WHERE tt.AreaId = t1.AreaId and tt.DeviceStatus =  t1.DeviceStatus
             FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
           ,1,4,'') Status

    FROM T t1
    WHERE DeviceStatus = 'Inactive'
) t1 RIGHT JOIN 
(
    SELECT distinct AreaId
    FROM T
) t2
on t1.AreaId = t2.AreaId 

sqlfiddle

结果

AreaId  Status
1      Active
2      00:00 hrs to 01:00 hrs
3      01:00 hrs to 02:00 hrs and 02:00 hrs to 03:00 hrs

关于sql - 以所需格式格式化结果集时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53003580/

相关文章:

sql - SQL 2005 中 XML 数据类型的大小限制

mysql - Mysql中如何更改列数据类型而不丢失数据

sql - Informix:如何获取最后插入的记录的ID

php - MySQL 中的查询优化

mysql - 使用 Mysql 处理时区

c# - command.ExecuteScalar 没有返回我知道存在的值

sql-server - 无法使用域凭据从 PowerShell 连接到 SQL Server

sql-server - 级别 : Hard - Extract data from XML in a hierarchy format

sql-server - T-SQL - #tempimport 在哪里?

sql - 如何找到当前时间段与任何表字段匹配?