[英]union three select queries with where clause into one datatable
我有一个查询,其中包含三个 RouteID 的 where 子句,因此每次返回 3 行而不是 1 行。
SELECT
A.ItemId, A.RefId, B.EquipmentName, C.PointId, C.PointDescription,
D.InspectionTimeStamp, D.AlarmCode, D.AlarmDescription,
A.RouteId, A.Type, A.SequenceNo, A.Skip, A.Item
FROM
[Trident].[Maintenance].[BasicCareEquipmentPointDetails] A
INNER JOIN
[Trident].[Maintenance].[Equipment] B ON A.ItemId = B.EquipmentId
INNER JOIN
[Trident].[Maintenance].[BasicCarePointDetails] C ON A.RouteId = C.RouteId
LEFT OUTER JOIN
[Trident].[Maintenance].[BasicCareInspectionHistory] D ON C.PointId = D.PointId
AND D.InspectionTimeStamp BETWEEN '02/18/2021' AND DATEADD(DAY, 1, '02/18/2021')
WHERE
A.RouteId IN ('RG00000792', 'RG00000800', 'RG00000801')
AND A.Skip = 0
AND A.ItemId = C.TemplateId
ORDER BY
A.RefId, A.SequenceNo DESC
这是查询的结果,每个 routeID 有 3 行,想为这些路由中的每一个和我可能需要的任何其他列捕获警报代码,并将列名更改为一行上的别名。 这样我就可以将所有三个路由放在一行中,以便 Active Reports 可以遍历有问题的数据源。
我包括我想要获得的报告的屏幕截图,每个班次都是一个 routeID。 正如您所看到的,每个都有一个 FILTER/COND STRIPPER,它位于最左侧的列下方和“Flush Filters”下方的子行,警报代码在每个路由列中都是 Ok。
我试过使用联合和论坛不推荐它。 此时,我可以在 vb.net 代码中进行三个 SQL 调用并创建所需的格式化表,然后遍历每个表并添加到自定义表中,但我觉得有更好的方法。 我正在使用 SQL 服务器 2017 (v14.0.3281.6)。
我相信我找到了一个解决方案,不确定它是否最容易在 vb.net 代码中实现,我必须调用临时表并且通常会自动生成一个冗长的名称。 例如,#TEMP_____________231651651 是我为另一个应用程序返回的。 但是这就是我们想出的任何人
Go
IF OBJECT_ID('tempdb..#Data') IS NOT NULL DROP Table #Data
SELECT A.ItemId ,A.RefId ,B.EquipmentName ,C.PointId ,C.PointDescription,
D.InspectionTimeStamp ,D.AlarmCode,D.AlarmDescription ,A.RouteId ,A.Type ,A.SequenceNo
,A.Skip ,A.Item INTO #Data FROM [Trident].[Maintenance].
[BasicCareEquipmentPointDetails] A INNER JOIN [Trident].[Maintenance].[Equipment] B ON
A.ItemId = B.EquipmentId INNER JOIN [Trident].[Maintenance].[BasicCarePointDetails] C
ON A.RouteId = C.RouteId LEFT OUTER JOIN [Trident].[Maintenance].
[BasicCareInspectionHistory] D ON C.PointId = D.PointId AND D.InspectionTimeStamp
BETWEEN '03/06/2020' AND DATEADD(DAY, 1, '03/06/2020') WHERE A.RouteId In
('RG00000792', 'RG00000800', 'RG00000801') AND A.Skip = 0 AND A.ItemId =
C.TemplateId ORDER BY A.RefId, A.SequenceNo Desc
SELECT *
FROM (SELECT ItemId
,RefId
,EquipmentName
,PointId
,PointDescription
,InspectionTimeStamp
,AlarmCode
,AlarmDescription
,RouteId
,type
,SequenceNo
,Skip
,Item FROM #Data) AS s
PIVOT (
MAX(AlarmCode)
FOR RouteId IN ([RG00000792], [RG00000800], [RG00000801])
) p
ORDER BY RefId, SequenceNo DESC
使用 pivot 功能。 不确定聚合 AlarmCode 列是否是最干净的,即使它没有对字符串值执行最大值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.