繁体   English   中英

如何计算查询中的相关行

[英]How do you count the related rows within a query

我正在尝试进行查询,以提取特定公司的所有票证。 该表中将有一个名为[Repeat]的列

我需要查询做的是检查在该票证的最后30天内是否还有其他行具有匹配的Circuit_ID。

"SELECT [MAIN_TICKET_ID], [CompID], [ActMTTR], [ActOTR], [DtCr], [DtRFC],
                CASE WHEN [PRIORITY] = 1 THEN '1' 
                     WHEN [PRIORITY] = 2 THEN '2' 
                     WHEN [PRIORITY] = 3 THEN '3' END AS [PRIORITY],
                CASE WHEN ([PRIORITY] = '1' AND [ActMTTR] >= '4' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '1' AND [ActOTR] >= '14' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '2' AND [ActMTTR] >= '6' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '2' AND [ActOTR] >= '16' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR (([Rpt5] = '1' OR [Rpt30] = '1' OR [Chronic] = '1') AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) THEN 'Yes' ELSE 'No' END AS [Measured],  
                CASE WHEN [Reviewed] = 1 THEN 'Yes' ELSE 'No' END AS [Reviewed],
                CASE WHEN [Rpt5] = 1 OR [Rpt30] = 1 THEN 'Yes' ELSE 'No' End As [Repeat],
                CASE WHEN [Chronic] = 1 THEN 'Yes' ELSE 'No' END AS [Chronic],
                CASE WHEN [ResCd7] = 'Equipment (XX)' THEN 'XX' 
                     WHEN [ResCd7] = 'Isolated to Customer (ITC)' THEN 'ITC' 
                     WHEN [ResCd7] = 'Information (INF)' THEN 'INF' 
                     WHEN [ResCd7] = 'Test OK (TOK)' THEN 'TOK' 
                     WHEN [ResCd7] = 'Lec Facilities (LEC)' THEN 'LEC' 
                     WHEN [ResCD7] = 'Dispatched No Trouble Found (NTF)' THEN 'NTF' 
                     WHEN [ResCD7] = 'Cleared While Testing (CWT)' THEN 'CWT' END AS [Resolution]
                FROM [SNA_Ticket_Detail] WHERE ([CompID] = @CompID)"

上面是当前查询,它依赖于表中的0或1标志。 在[Rpt5] = 1或[Rpt30] = 1时在情况下看到的情况为[重复],否则为“是”,否则为“否”

我想做的就是用类似

CASE WHEN (SELECT COUNT([XX_CIRCUIT_ID]) FROM SNA_Ticket_Detail WHERE (CONVERT(CHAR(10), [DtRFC], 101) BETWEEN ([DtRFC] - 6) AND ([DtRFC])) AND (XX_CIRCUIT_ID = XX_CIRCUIT_ID)) > '1' THEN 'Yes' ELSE 'No' End As [Repeat],

这是行不通的。它基本上是对所有行进行计数,而不是仅对与当前行电路ID匹配并在上个月内的行进行计数。

我不知道如何正确编码以使其正常工作。 甚至在查询范围内也是如此。

您想对同一个表运行子查询,因此您需要为表的两种用法(下面的recent和td)加上别名。 当寻找感兴趣的行时,在这种情况下,它们具有相同的Circuit ID并且在一定范围内,因此需要确保您没有寻找完全相同的行。 因此,请检查[MAIN_TICKET_ID]。 您可以按照示例执行COUNT,也可以执行以下EXISTS()。

SELECT [MAIN_TICKET_ID], [CompID], [ActMTTR], [ActOTR], [DtCr], [DtRFC],
                CASE WHEN [PRIORITY] = 1 THEN '1' 
                     WHEN [PRIORITY] = 2 THEN '2' 
                     WHEN [PRIORITY] = 3 THEN '3' END AS [PRIORITY],
                CASE WHEN ([PRIORITY] = '1' AND [ActMTTR] >= '4' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '1' AND [ActOTR] >= '14' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '2' AND [ActMTTR] >= '6' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR ([PRIORITY] = '2' AND [ActOTR] >= '16' AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) 
                       OR (([Rpt5] = '1' OR [Rpt30] = '1' OR [Chronic] = '1') AND ([ResCd7] = 'Equipment (XX)' OR [ResCd7] = 'Lec Facilities (LEC)')) THEN 'Yes' ELSE 'No' END AS [Measured],  
                CASE WHEN [Reviewed] = 1 THEN 'Yes' ELSE 'No' END AS [Reviewed],
                CASE WHEN EXISTS ( select * from SNA_Ticket_Detail recent 
                       where recent.XX_CIRCUIT_ID = td.XX_CIRCUIT_ID
                       AND recent.[MAIN_TICKET_ID] <> td.[MAIN_TICKET_ID]
                       AND datediff( month, recent.[DtRFC], td.[DtRFC] ) < 1 
                      AND recent.[DtRFC] < td.[DtRFC]) 
            THEN 'Yes' ELSE 'No' End As [Repeat],
                CASE WHEN [Chronic] = 1 THEN 'Yes' ELSE 'No' END AS [Chronic],
                CASE WHEN [ResCd7] = 'Equipment (XX)' THEN 'XX' 
                     WHEN [ResCd7] = 'Isolated to Customer (ITC)' THEN 'ITC' 
                     WHEN [ResCd7] = 'Information (INF)' THEN 'INF' 
                     WHEN [ResCd7] = 'Test OK (TOK)' THEN 'TOK' 
                     WHEN [ResCd7] = 'Lec Facilities (LEC)' THEN 'LEC' 
                     WHEN [ResCD7] = 'Dispatched No Trouble Found (NTF)' THEN 'NTF' 
                     WHEN [ResCD7] = 'Cleared While Testing (CWT)' THEN 'CWT' END AS [Resolution]
                FROM [SNA_Ticket_Detail] td WHERE ([CompID] = @CompID)

您应该检查datediff是否满足您的要求-只需处理一些测试数据即可。 另外,您可能想确保“最新”行实际上不在检索到该行之后,因此我添加了:

AND recent.[DtRFC] < td.[DtRFC]

尽管如果您知道票证ID是连续的,则可以用它们代替日期字段执行相同的操作。

如果在外部查询中为SNA_Ticket_Detail(例如SNA_Ticket_Detail SNA)添加别名,则可以在子查询中引用该别名。

为简单起见,在子查询中还别名为SNA_Tick_Detail(SNA_Ticket_Detail SNA_sub)

然后,您当前拥有(XX_CIRCUIT_ID = XX_CIRCUIT_ID)的位置将变为(SNA_sub.XX_CIRCUIT_ID = SNA.XX_CIRCUIT_ID)

为了对SQL进行最小的更改,请按以下方式更改子查询:

SELECT ... FROM SNA_Ticket_Detail AS i WHERE ... AND i.XX_CIRCUIT_ID = [SNA_Ticket_Detail].[XX_CIRCUIT_ID]

您必须以某种方式引用外部表,不能只比较XX_CIRCUIT_IDXX_CIRCUIT_ID是否相等-这将始终是对的。 ;-)

相反,您必须将外部XX_CIRCUIT_ID (称为[SNA_Ticket_Detail].[XX_CIRCUIT_ID]与内部XX_CIRCUIT_ID (为清楚起见,称为i.XX_CIRCUIT_ID进行比较。

尝试

SELECT(COUNT()...)> 1

代替

SELECT(COUNT()...)>'1'

那是一个凌乱的查询...

您需要将“内部”查询(aka子查询)过滤为外部查询。 该概念通常称为相关子查询 请参阅罗里的解决方案。

或者,您可以对包含聚合数据的视图(或派生表)使用JOIN。 通常,这是性能的最佳选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM