首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用逻辑条件在现有表上创建查询并生成包含bool数据的表(视图)?

如何使用逻辑条件在现有表上创建查询并生成包含bool数据的表(视图)?
EN

Stack Overflow用户
提问于 2015-06-23 13:18:29
回答 2查看 70关注 0票数 1

我所拥有的是一个MS数据库,用于存储来自于安装在某些车辆中的设备的数据/信息(每辆车有1-3台设备)。

目前,数据库中有一个名为Communication的表--一个用于存储设备连接到TCP服务器时来自设备的所有信息的大表。一个接一个地添加记录(只在这里插入)。

这张桌子是这样的:

我需要的是一个SQL查询(命令/语句)来为所谓的“每周通信状态”创建一个表(视图),在这里我可以看到如果/车辆在过去7天中如何通信.如下表所示:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-23 13:46:35

作为上述选项的另一种选择,您知道输出中只有7个日期列,您可以使用手动转轴,而不是使用pivot运算符。

请参阅SQLFiddle

代码语言:javascript
运行
复制
select VehicleNumber, 
      CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-7,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [7 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-6,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [6 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-5,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [5 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-4,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [4 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-3,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [3 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-2,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [2 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, DATEADD(d,-1,GETDATE())) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [1 Days Ago]
      ,CASE WHEN SUM(CASE WHEN DATEDIFF(d,DateTimeCommunication, GETDATE()) = 0 THEN 1 ELSE 0 END) > 0 THEN 'YES' Else 'NO' END AS [0 Days Ago]
from Communications
GROUP BY VehicleNumber
票数 2
EN

Stack Overflow用户

发布于 2015-06-23 13:27:34

下面是一种动态PIVOT方法。

代码语言:javascript
运行
复制
CREATE TABLE #temp(equipmentID int, vehicleNumber int, DateTimeCommunication datetime)

INSERT INTO #temp(equipmentID, vehicleNumber, DateTimeCommunication)
VALUES  (1,100,GETDATE()),
        (2,110,GETDATE()),
        (3,120,GETDATE()),
        (5,140,GETDATE()),
        (1,100,DATEADD(day,-8,GETDATE())),
        (3,120,DATEADD(day,-8,GETDATE())),
        (4,130,DATEADD(day,-8,GETDATE())),
        (5,140,DATEADD(day,-8,GETDATE()))

DECLARE @sql nvarchar(max), @columns nvarchar(max), @columnsSelect nvarchar(max)

SELECT @columns = COALESCE(@columns + N',['+CONVERT(nvarchar(max),dateCom)+N']',N'['+CONVERT(nvarchar(max),dateCom)+N']')
FROM (
    SELECT DISTINCT CONVERT(date, DateTimeCommunication) as dateCom
    FROM #temp
) as allDates
ORDER BY dateCom

SELECT @columnsSelect = COALESCE(@columnsSelect + N',ISNULL(['+CONVERT(nvarchar(max),dateCom)+N'],N''NO'') as '''+CONVERT(nvarchar(max),dateCom)+'''',
                                    N'ISNULL(['+CONVERT(nvarchar(max),dateCom)+N'],N''NO'') as '''+CONVERT(nvarchar(max),dateCom)+'''')
FROM (
    SELECT DISTINCT CONVERT(date, DateTimeCommunication) as dateCom
    FROM #temp
) as allDates
ORDER BY dateCom

SET @sql = N'SELECT pvt.vehicleNumber, '+@columnsSelect+'
FROM (
    SELECT t.equipmentID, t.vehicleNumber, CONVERT(date,DateTimeCommunication) as dateCom,
        CASE WHEN t.DateTimeCommunication BETWEEN DATEADD(day,-7,GETDATE()) AND GETDATE() 
            THEN N''YES''
            ELSE N''NO''
        END as communicated
    FROM #temp t
) as dat
PIVOT(
    MAX(communicated)
    FOR dateCom IN('+@columns+')
) as pvt'
PRINT(@sql)
EXEC (@sql)

DROP TABLE #temp

如果您不需要动态的或仅针对指定的日期范围,只需将其简化为:

代码语言:javascript
运行
复制
CREATE TABLE #temp(equipmentID int, vehicleNumber int, DateTimeCommunication datetime)

INSERT INTO #temp(equipmentID, vehicleNumber, DateTimeCommunication)
VALUES  (1,100,GETDATE()),
        (2,110,GETDATE()),
        (3,120,GETDATE()),
        (5,140,GETDATE()),
        (1,100,DATEADD(day,-8,GETDATE())),
        (3,120,DATEADD(day,-8,GETDATE())),
        (4,130,DATEADD(day,-8,GETDATE())),
        (5,140,DATEADD(day,-8,GETDATE()))

SELECT *
FROM (
    SELECT t.equipmentID, t.vehicleNumber, CONVERT(date,DateTimeCommunication) as dateCom,
        CASE WHEN t.DateTimeCommunication BETWEEN DATEADD(day,-7,GETDATE()) AND GETDATE() 
            THEN N'YES'
            ELSE N'NO'
        END as communicated
    FROM #temp t
) as dat
PIVOT(
    MAX(communicated)
    FOR dateCom IN([2015-06-23]) --needs to be changed on different date!
) as pvt

DROP TABLE #temp
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31003902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档