我所拥有的是一个MS-SQL数据库,用于存储来自某些车辆中安装的设备的数据/信息(每辆车1-3个设备)。
目前,数据库中有一个名为DeviceStatus的表 - 一个用于存储设备连接到TCP服务器时的所有信息的大表。这里添加了记录(sql INSERT)或更新(sql UPDATE)。
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查询(命令/语句)来为所谓的"软件版本表"创建一个表(视图),在那里我可以看到安装的所有设备的软件版本车辆(所有与服务器连接并通信的人)......如下表所示:
备注:414的设备#1丢失,因为它没有通信(我还没猜到......)
答案 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,