2016-12-28 1 views
1

SSRS를 사용하는 발권 시스템에 대한 보고서를 작성하려고합니다. "인시던트 바디"테이블과 "인시던트 세부 사항"테이블 모두에서 필드를 가져오고 있습니다. 내가 찾고있는 것은 티켓이 SLA를지나 고객에게 응답했는지 여부입니다.SSRS SQL 쿼리의 결과 제한

내가 SLA 과거 티켓을 검사하고 두 가지 방법 :

1) 티켓은 SLA 기간이 지났이며, 소정의 유형
2) 티켓이 소정의 일치하는 상세 기록이 일치하는 상세 기록이 없다 유형이지만 SLA 날짜 이후였습니다

아래의 CTE 섹션을 만들었지 만 그 결과를 가장 오래된 일치하는 행/레코드로 줄이는 방법에 어려움을 겪고 있습니다. 티켓은 보고서에 한 번만 표시되어야합니다. 예를 들어

:

조니 블로그 2016년 1월 1일에 CONTACTED_TM의 RECORDTYPE를 사용하여 티켓을 업데이트합니다. SLA는 2015 년 12 월 31 일이었습니다. 다음 날 (1/20/20) 그는 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' 
+0

"** 처음 **"을 정의하십시오. RN으로'row_numer() (Part by I. [Incident #] order by Date desc)]와 같은 것을 CTE에 추가하기를 원할 것입니다. 그리고 선택의 맨 아래에있는'RN = 1'을 CTE – scsimon

답변

0

주석에 언급 된 것과 같이.

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 
+0

이것이 작동하는 것 같습니다. 감사합니다! 나는 'AND CTE.RN = 1'에 약간의 변경을가했는데, 여기서'AND (CTE.RN = 1 OR CTE.RN IS NULL) '로 변경했습니다. 마음 속에 늦은 시간의 첫 번째 기록만을 제공해야합니다. 응답 또는 전혀 응답이없는 레코드를 포함 할 수 있습니다. – errational