2016-09-12 8 views
1

これは私が今使っている全体のクエリです。最初の部分はうまくいくようですが、 "Y as"から始めて、赤で下線が引かれているすべての列を表示します。私は、赤い下線を示す太字のステートメントをマークしています。私は、このクエリで把握できなかったSLAの割合を計算する必要があります。営業時間は、午前4時30分から午後5時30分までは月曜日から日曜日まで、月曜日から金曜日は午前4時30分から午後10時30分までです。SLAを計算するためにselectから作成された一時列を比較するにはどうすればよいですか?

SELECT 
    [JOB_TICKET].[JOB_TICKET_ID], 
    [JOB_TICKET].[REPORT_DATE], 
    [JOB_TICKET].[FIRST_RESPONSE_DATE], 
    [JOB_TICKET].CLOSE_DATE, 
    ,[JOB_TICKET].LAST_UPDATED, 
    [PRIORITY_TYPE].[PRIORITY_TYPE_NAME] AS 'Ticket_Priority' , 
    DATEDIFF(MINute, report_date,FIRST_RESPONSE_DATE) as 'time_to_accept' , 
    sum (CASE 
     WHEN (DATEDIFF(MINute,report_date,FIRST_RESPONSE_DATE) <= '10') 
      THEN 1 
     ELSE 0 
     END) AS "SLA time_to_accept Status", 
    DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) as 'time_to_resolve' , 
    (CASE 
      when PRIORITY_TYPE_NAME='low' 
      then sum(case 
         when DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) <= '960' 
         then 1 
         else 0 
         end) 
      when PRIORITY_TYPE_NAME='medium' 
      then sum(case 
         when DATEDIFF(MINUTE[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) <= '480' 
         then 1 
         else 0 
         end) 
      when PRIORITY_TYPE_NAME='high' 
      then sum(case 
         when DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET]. [CLOSE_DATE]) <= '120' 
          then 1 
          else 0 
         end) 
      when PRIORITY_TYPE_NAME='Urgent' 
      then sum(case 
         when DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET]. [CLOSE_DATE]) <= '60' 
          then 1 
          else 0 
         end) 
      end) as "Closed within SLA" FROM [SWHD01].[dbo].[JOB_TICKET] INNER JOIN [SWHD01].[dbo].[STATUS_TYPE] ON [JOB_TICKET].[STATUS_TYPE_ID] =[STATUS_TYPE].[STATUS_TYPE_ID] INNER JOIN [SWHD01].[dbo].[PROBLEM_TYPE] ON [JOB_TICKET].[PROBLEM_TYPE_ID] = [PROBLEM_TYPE].[PROBLEM_TYPE_ID] INNER JOIN [SWHD01].[dbo].[PRIORITY_TYPE] ON [JOB_TICKET].[PRIORITY_TYPE_ID] = [PRIORITY_TYPE].[PRIORITY_TYPE_ID] where REPORT_DATE is not null and DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) is not null and DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) > 0 group by JOB_TICKET_ID,[JOB_TICKET].[REPORT_DATE],[JOB_TICKET].[FIRST_RESPONSE_DATE], 
    [JOB_TICKET].CLOSE_DATE,[JOB_TICKET].LAST_UPDATED,[PRIORITY_TYPE].[PRIORITY_TYPE_NAME] 
+0

いくつかのサンプルデータ JOB_TICKET_ID \t Open_DATE \t FIRST_RESPONSE_DATE \t CLOSE_DATE \t LAST_UPDATED \t Ticket_Priority \t time_to_accept \t SLAのtime_to_acceptステータス\t time_to_resolveは\tは 1/1/15夜12時00分\t 1/1/15 SLA内で閉じて0:01 \t 1/1/15 1:25 \t 1/1/15 1:25 \t Low sla met SLAは 1/1/15 0:18 \t 1/1/15 0時21 \t 1/1/15午後12時24分\t 1/1/15午後12時24分\t低 SLAは\t 3を満たし会っ\t sla met –

答えて

0
  • あなたがそれらの長いDATEDIFF表現を繰り返す必要はありませんので、CTEを使用し、time_to_accepttime_to_resolveを再利用する必要があるため。
  • time_to_accept and time_to_resolveに長いCASEの式を繰り返す必要がないように、別のCTEを使用してください。
  • 最後に、 FROMの文をプライマリSELECTから完全に削除しました。私はFROM SomeTableをプレースホルダとして追加しました。

WITH X AS (
SELECT 
    [JOB_TICKET].[JOB_TICKET_ID], 
    [JOB_TICKET].[REPORT_DATE], 
    [JOB_TICKET].[FIRST_RESPONSE_DATE], 
    [JOB_TICKET].CLOSE_DATE, 
    [JOB_TICKET].LAST_UPDATED, 
    [PRIORITY_TYPE].[PRIORITY_TYPE_NAME] AS 'Ticket_Priority', 
    DATEDIFF(MINute, report_date,FIRST_RESPONSE_DATE) as 'time_to_accept', 
    DATEDIFF(MINUTE,[JOB_TICKET].[FIRST_RESPONSE_DATE],[JOB_TICKET].[CLOSE_DATE]) as 'time_to_resolve' 
FROM SomeTable 
), 
Y AS (
SELECT 
    X.JOB_TICKET_ID, 
    X.REPORT_DATE, 
    X.FIRST_RESPONSE_DATE, 
    X.CLOSE_DATE, 
    X.LAST_UPDATED, 
    X.Ticket_Priority, 
    X.time_to_accept, 
    X.time_to_resolve, 
    case when time_to_accept <= 10 then 1 else 0 end 
     AS "SLA time_to_accept Status", 
    case when time_to_resolve <= case PRIORITY_TYPE_NAME 
            WHEN 'low' then 960 
            WHEN 'medium' then 480 
            WHEN 'high' then 120 
            WHEN 'Urgent' then 60 
            END 
     then 1 
     else 0 end 
     AS "Closed within SLA" 
) 

SELECT 
    Y.JOB_TICKET_ID, 
    Y.REPORT_DATE, 
    Y.FIRST_RESPONSE_DATE, 
    Y.CLOSE_DATE, 
    Y.LAST_UPDATED, 
    Y.Ticket_Priority, 
    Y.time_to_accept, 
    Y.time_to_resolve, 
    Y.[SLA time_to_accept Status], 
    Y.[Closed within SLA], 
    case WHEN [SLA time_to_accept Status]=1 and [Closed within SLA]=1 
     then 1 
     else 0 
     end 
     AS [SLA Compliant] 
FROM Y  
+0

こんにちは、あなたの貴重な入力をありがとう、私は最初の場所で全体のクエリを追加することを忘れてしまった。私は今それを忠告した。私は、このクエリで把握できなかったSLAの割合を計算する必要があります。営業時間は、午前4時30分から午後5時30分までは月曜日から日曜日まで、月曜日から金曜日は午前4時30分から午後10時30分までです。 –

+0

こんにちは、私は今質問を編集しました。 –

+0

私は営業時間枠内にあるチケットのみを取得できるように、営業時間のみをクエリに含めるための条件を追加することもできます。営業時間は、午前4時30分から午後5時30分まではSAturday-sunday、金曜日から午前4時30分から午後10時30分まで、休日を除外してください。@RossPresser –

関連する問題