0

我有一个查询,其中包含三个 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 Server 2017 (v14.0.3281.6)。

查询结果

在此处输入图像描述

4

1 回答 1

0

我相信我找到了一个解决方案,不确定它是否最容易在 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

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

于 2021-02-23T17:41:55.770 回答