【问题标题】:Limiting results in SSRS SQL query限制 SSRS SQL 查询中的结果
【发布时间】:2016-12-28 21:35:06
【问题描述】:

我正在尝试使用 SSRS 构建关于我们的票务系统的报告。我从“事件主体”表和“事件详细信息”表中引入字段。我正在寻找的是票证是否已经超过了响应客户的 SLA。

我通过两种方式检查超过 SLA 的票:

1) 工单已超过 SLA 日期,并且没有与预定类型匹配的详细记录
2) 工单有与预定类型匹配的详细记录,但它在 SLA 日期之后

我能够构建下面的 CTE 部分,但我正在努力解决如何将结果减少到最旧的匹配行/记录。一张票只能在报告中出现一次。

例如:

Johnny Blogs 于 2016 年 1 月 1 日使用 CONTACTED_TM 记录类型更新票证。 SLA 是 2015 年 12 月 31 日。第二天(2016 年 1 月 2 日),他还使用 EMAILOUT 记录类型向 TM 发送电子邮件。 CTE 返回这两个行/记录。我只想要第一个结果。

我的查询代码如下。我曾尝试在 CTE 中使用 SELECT TOP 1,但它只会导致它不返回任何结果。

WITH CTE (Date, [Action ID], Description, Note, [Login ID], [Seq.Group], [Incident #], ResponseDue) AS
(
SELECT Date, [Action ID], [Incident Details].Description, [Incident Details].Note, [Login ID], [Incident Details].[Seq.Group], [Incident Details].[Incident #], [Incident].[Due Date & Time:] as ResponseDue
FROM [_SMDBA_].[Incident Details]
JOIN [_SMDBA_].[Incident]
ON [Incident Details].[Incident #] = [Incident].[Incident #]
WHERE ([Action ID] = 'CONTACTED_TM' OR [Action ID] = 'TM_UNAVAILABLE' OR ([Action ID] = N'EMAILOUT' AND _SMDBA_.[Incident].[Client Email] in ([Email To Email From])))
--AND Date >= Incident.[Due Date & Time:]
)

SELECT
I.[Incident #]
,I.[Group Name]
,I.[Seq.Group] as IncidentGroupSeq
,I.[Due Date & Time:] as ResponseDue
,I.[Priority ID:]
,I.[Priority Duration]
,I.[Subject ID]
,I.[Open Date & Time] as OpenDate
,I.[Impact ID:] as Impact
,I.[Urgency ID:] as Urgency

,CTE.[Action ID]
,CTE.Description
,CTE.Note
,CTE.[Login ID]
,CTE.Date AS IncidentDetailsDate
,CTE.[Seq.Group] as DetailsGroupSeq

,_SMDBA_.CalcWorkingSeconds(1001,[Due Date & Time:],CTE.Date) as WorkingSecs

,CASE
       WHEN CTE.date >= I.[Due Date & Time:] THEN 'Response was Late'
          WHEN CTE.Date IS NULL THEN 'There was no response'
          WHEN CTE.date <= I.[Due Date & Time:] THEN 'Met SLA'
          WHEN I.[Due Date & Time:] IS NULL THEN 'No Response date set'
      END AS SLAStatus

FROM [_SMDBA_].Incident I
LEFT OUTER JOIN CTE
ON CTE.[Incident #] = I.[Incident #]
WHERE 
 I.[Open Date & Time] >= @StartDate
AND I.[Open Date & Time] <= @EndDate
AND I.[Group Name] in (@Group)
AND I.[Impact ID:] in (@Impact)
AND I.[Urgency ID:] in (@Urgency)
AND I.[Opened Group:] = 'SERVICE DESK'

【问题讨论】:

  • 定义“First。”您将要在您的 CTE 中添加类似 row_numer() over (partition by I.[Incident #] order by Date desc) as RN 的内容,然后在您从 CTE 中选择的底部使用 where RN = 1

标签: sql sql-server ssrs-2008-r2 common-table-expression


【解决方案1】:

类似这样的东西,如 cmets 中所引用。

WITH CTE ([Date], [Action ID], Description, Note, [Login ID], [Seq.Group], [Incident #], ResponseDue) AS
(
    SELECT 
        [Date], 
        [Action ID], 
        [Incident Details].Description, 
        [Incident Details].Note, 
        [Login ID], 
        [Incident Details].[Seq.Group], 
        [Incident Details].[Incident #], 
        [Incident].[Due Date & Time:] as ResponseDue,
        row_number() over (partition by [Incident Details].[Incident #] order by [Date] desc) as RN
    FROM [_SMDBA_].[Incident Details]
        JOIN 
            [_SMDBA_].[Incident]
            ON [Incident Details].[Incident #] = [Incident].[Incident #]
    WHERE 
        ([Action ID] = 'CONTACTED_TM' OR [Action ID] = 'TM_UNAVAILABLE' OR 
        ([Action ID] = N'EMAILOUT' AND _SMDBA_.[Incident].[Client Email] in ([Email To Email From])))
--AND Date >= Incident.[Due Date & Time:]
)

SELECT
I.[Incident #]
,I.[Group Name]
,I.[Seq.Group] as IncidentGroupSeq
,I.[Due Date & Time:] as ResponseDue
,I.[Priority ID:]
,I.[Priority Duration]
,I.[Subject ID]
,I.[Open Date & Time] as OpenDate
,I.[Impact ID:] as Impact
,I.[Urgency ID:] as Urgency

,CTE.[Action ID]
,CTE.Description
,CTE.Note
,CTE.[Login ID]
,CTE.Date AS IncidentDetailsDate
,CTE.[Seq.Group] as DetailsGroupSeq

,_SMDBA_.CalcWorkingSeconds(1001,[Due Date & Time:],CTE.Date) as WorkingSecs

,CASE
       WHEN CTE.date >= I.[Due Date & Time:] THEN 'Response was Late'
          WHEN CTE.Date IS NULL THEN 'There was no response'
          WHEN CTE.date <= I.[Due Date & Time:] THEN 'Met SLA'
          WHEN I.[Due Date & Time:] IS NULL THEN 'No Response date set'
      END AS SLAStatus

FROM [_SMDBA_].Incident I
LEFT OUTER JOIN CTE
ON CTE.[Incident #] = I.[Incident #]
WHERE 
 I.[Open Date & Time] >= @StartDate
AND I.[Open Date & Time] <= @EndDate
AND I.[Group Name] in (@Group)
AND I.[Impact ID:] in (@Impact)
AND I.[Urgency ID:] in (@Urgency)
AND I.[Opened Group:] = 'SERVICE DESK'
AND CTE.RN = 1

【讨论】:

  • 这似乎可行,谢谢!我对AND CTE.RN = 1 做了一个小改动,将其更改为:AND (CTE.RN = 1 OR CTE.RN IS NULL),在我看来,它应该只提供第一个延迟响应记录的结果,或者根本没有响应的记录。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多