如何在现有表上创建查询并使用聚合数据和限制构建表(视图)?

时间:2015-11-27 13:40:07

标签: sql sql-server sql-server-2012 qsqlquery

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

目前,数据库中有一个名为DeviceStatus的表 - 一个用于存储设备连接到TCP服务器时的所有信息的大表。这里添加了记录(sql INSERT)或更新(sql UPDATE)。

表格如下:
enter image description here

Sample data:   
1040    305 3   8.00    0
1044    305 2   8.00    0
1063    305 1   8.01    1.34
1071    312 2   8.00    0
1075    312 1   8.00    1.33
1078    312 3   8.00    0
1099    414 3   8.00    0
1106    414 2   8.01    0
1113    102 1   8.01    1.34
1126    102 3   8.00    0

备注驱动程序控制台始终与安装在第一个位置的设备相关(它是位置1上设备的扩展;显然只有一个位置)每辆车的控制台) - 所以,这将是某种限制,以便在下面显示的所需表格(视图)中获得正确的信息:)。

我需要的是一个SQL查询(命令/语句)来为所谓的"软件版本表"创建一个表(视图),在那里我可以看到安装的所有设备的软件版本车辆(所有与服务器连接并通信的人)......如下表所示:
enter image description here

备注:414的设备#1丢失,因为它没有通信(我还没猜到......)

2 个答案:

答案 0 :(得分:2)

根据我们到目前为止的信息,我认为你需要一个PIVOT查询:

SELECT P.VehicleNo, V.DriverConsoleVersion, P.[1] AS [Device1SwVersion], P.[2] AS [Device1SwVersion], P.[3] AS [Device1SwVersion]
FROM (
    SELECT VehicleNo, [1], [2], [3]
    FROM (
        SELECT VehicleNo, DevicePosition, DeviceSwVersion
        FROM @DeviceInfo
    ) as d
    PIVOT (
        MAX(DeviceSwVersion)
        FOR DevicePosition IN ([1], [2], [3])
    ) PIV
) P 
LEFT JOIN @DeviceInfo V
    ON V.VehicleNo = P.VehicleNo AND V.DevicePosition = 1;

您可以使用此类查询创建视图。

对于每辆车,第一个子查询为设备1到3获得4列。 然后将它与SwVersion表LEFT JOIN以获得与Device 1关联的Console版本。

<强>输出:

VehicleNo   DriverConsoleVersion    Device1SwVersion    Device1SwVersion    Device1SwVersion
102         1.34                    8.01                NULL                8.00
305         1.34                    8.01                8.00                8.00
312         1.33                    8.00                8.00                8.00
414         NULL                    NULL                8.01                8.00

您的数据:

Declare @DeviceInfo TABLE([DeviceSerial] int, [VehicleNo] int, [DevicePosition] int, [DeviceSwVersion] varchar(10), [DriverConsoleVersion] varchar(10));

INSERT INTO @DeviceInfo([DeviceSerial], [VehicleNo], [DevicePosition], [DeviceSwVersion], [DriverConsoleVersion])
VALUES
    (1040, 305, 3, '8.00', '0'),
    (1044, 305, 2, '8.00', '0'),
    (1063, 305, 1, '8.01', '1.34'),
    (1071, 312, 2, '8.00', '0'),
    (1075, 312, 1, '8.00', '1.33'),
    (1078, 312, 3, '8.00', '0'),
    (1099, 414, 3, '8.00', '0'),
    (1106, 414, 2, '8.01', '0'),
    (1113, 102, 1, '8.01', '1.34'),
    (1126, 102, 3, '8.00', '0')
;

答案 1 :(得分:1)

我喜欢PIVOT答案,但这是另一种方式:

select VehicleNo,
max(DriverConsoleVersion) DriverConsoleVersion,
max(case when DevicePosition = 1 then DeviceSwVersion end) Device1SwVersion,
max(case when DevicePosition = 2 then DeviceSwVersion end) Device2SwVersion,
max(case when DevicePosition = 3 then DeviceSwVersion end) Device3SwVersion
from @DeviceInfo
group by VehicleNo
order by VehicleNo

您也可以对它们进行转换或格式化。所以可能是:

       select ...,
       isnull(cast(cast(
          max(case when DevicePosition = 1 then DeviceSwVersion end)
            as decimal(8,2)) / 100) as varchar(5)), '')  Device1SwVersion,