将带有 where 子句的三个 select 查询合并到一个数据表中

union three select queries with where clause into one datatable

我有一个包含三个 RouteID 的 where 子句的查询,因此每次有 3 行 returns 而不是一个。

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 行,我想捕获每条路线的 alarmCode 以及我可能需要的任何其他列,并将列名更改为一行中的别名。这样我就可以将所有三个路由排在一行中,这样 Active Reports 就可以遍历有问题的数据源。

我附上了我正在尝试获取的报告的屏幕截图,其中每个班次都是一个 routeID。正如您所看到的,每个都有一个 FILTER/COND STRIPPER,它位于最左侧的列下方,在“冲洗过滤器”下方有一个子行,警报代码将是每个路线列中的 Ok。

我试过用union,论坛不推荐。此时我可以在 vb.net 代码中进行三个 SQL 调用并创建所需的格式化 table 并遍历每个 table 并添加到自定义 table但我觉得有更好的方法。我正在使用 SQL Server 2017 (v14.0.3281.6)。

我相信我找到了一个解决方案,不确定它是否最容易在 vb.net 代码中实现,我不得不调用临时 table 并且通常会自动生成一个冗长的名称。 #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

使用枢轴功能。不确定聚合 AlarmCode 列是否是最干净的,即使它没有对字符串值做最大值