将带有 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 列是否是最干净的,即使它没有对字符串值做最大值
我有一个包含三个 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 列是否是最干净的,即使它没有对字符串值做最大值