2017-02-17 1 views
0

Ich möchte ähnliche ein fucntion verwenden Funktion in SQL COUNTIFSIch möchte ähnliche ein fucntion verwenden Funktion in SQL COUNTIFS

Diese Abfrage mich soll eine Anzahl von Tickets geben, die SLA erfüllt (Tickets waren in weniger als 10 Minuten angenommen und ist unter einer bestimmten Zeit in Abhängigkeit von den Prioritäten)

der SLA Abschnitt in meiner Anfrage ist mir einen Fehler

----------------------------SLA---------------------------- 
,CAST ((sum(case WHEN datediff(minute,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Assigned to %%NOC%Level 2%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Assigned to %%NOC%Level 1%'))) <= 10   and 
datediff(MINUTE,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from % to closed%%')) <= 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)*100.0)/COUNT(*) as money) as Percent_Compliant 

ich einen Fehler die obigen Abfrage versuchte, bekam aber gelöst worden

(Msg 130, Level 15, State 1, Line 94 
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.) 

ich den Code für Tickets zurück 100% erwarte, die SLA erfüllt und unten ist mein voller Code:

Declare @Top int = null    --<< Sets top of Hier Try 12 
Declare @Nest varchar(25) ='|-----' --<< Optional: Added for readability 

;with cteHB (Seq,Path,PROBLEM_TYPE_ID,PARENT_ID,Lvl,PROBLEM_TYPE_NAME) as (
    Select Seq = cast(1000+Row_Number() over (Order by PROBLEM_TYPE_NAME) as varchar(500)) 
      ,Path = cast(PROBLEM_TYPE_ID as varchar(500)) 
      ,PROBLEM_TYPE_ID 
      ,PARENT_ID 
      ,Lvl=1 
      ,PROBLEM_TYPE_NAME 
    From problem_type 
    Where IsNull(@Top,-1) = case when @Top is null then isnull(PARENT_ID,-1) else PROBLEM_TYPE_ID end 
    Union All 
    Select Seq = cast(concat(cteHB.Seq,'.',1000+Row_Number() over (Order by cteCD.PROBLEM_TYPE_NAME)) as varchar(500)) 
      ,Path = cast(concat(cteHB.Path,'.',cteCD.PROBLEM_TYPE_ID) as varchar(500)) 
      ,cteCD.PROBLEM_TYPE_ID 
      ,cteCD.PARENT_ID,cteHB.Lvl+1 
      ,cteCD.PROBLEM_TYPE_NAME 
    From problem_type cteCD 
    Join cteHB on cteCD.PARENT_ID = cteHB.PROBLEM_TYPE_ID) 
    ,cteR1 as (Select Seq,PROBLEM_TYPE_ID,R1=Row_Number() over (Order By Seq) From cteHB) 
    ,cteR2 as (Select A.Seq,A.PROBLEM_TYPE_ID,R2=Max(B.R1) From cteR1 A Join cteR1 B on (B.Seq like A.Seq+'%') Group By A.Seq,A.PROBLEM_TYPE_ID) 
    ,cteFinalHier as (
     Select B.R1 
       ,C.R2 
       ,A.PROBLEM_TYPE_ID 
       ,A.PARENT_ID 
       ,A.Lvl 
       ,PROBLEM_TYPE_NAME = Replicate(@Nest,A.Lvl-1) + A.PROBLEM_TYPE_NAME 
       ,A.Seq          -- < Included for Illustration 
       ,A.Path          -- < Included for Illustration 
     From cteHB A 
     Join cteR1 B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID 
     Join cteR2 C on A.PROBLEM_TYPE_ID=C.PROBLEM_TYPE_ID 
    ) 
Select A.Job_ticket_id 

     ,[Problem_Type_Name(Parent)]=C.PROBLEM_TYPE_NAME 
     ,[Problem_Type_Name(Child)] =B.PROBLEM_TYPE_NAME 
     ,HISTORY_ENTRY.ENTRY_DATE 
     ,case when HISTORY_ENTRY.ENTRY_TEXT like max('%Assigned to %%NOC%Level 2%') and HISTORY_ENTRY.ENTRY_TEXT not like max('%Assigned to %%NOC%Level 1%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like max('%Escalated to %%NOC%Level 1%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Status changed from % to hold%%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Status changed from %Hold to %%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Status changed from % to Resolved%%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Status changed from %Resolved to %%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Status changed from % to Closed%%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Ticket Type changed%') 
     or HISTORY_ENTRY.ENTRY_TEXT like max('%Reopen%') 
     then HISTORY_ENTRY.ENTRY_TEXT end as 'History Entry' 


,DATEDIFF(MINUTE, (select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from % to hold%%'), 
           (select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from %Hold to %%')) as 'hold time' 

,datediff(minute,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Assigned to %%NOC%Level 2%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Assigned to %%NOC%Level 1%'))) as 'Time to Accept SLA' ----> (this is time difference captured from the history details of ticket when it was first Escalated to level 2 till the time it was accepted by technician in Level 2) 

,datediff(minute,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from % to resolved%%')) as 'Escalated to Resolved time' ----> (this is time difference captured from the history details of ticket when it was first Escalated to level 2 till the time its status changed to resolved) 

,datediff(MINUTE,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from % to closed%%')) as 'Escalated to Closed time' ----> (this is time difference captured from the history details of ticket when it was first Escalated to level 2 till the time its status changed to closed) 


     ,A.Report_Date 
     ,A.LAST_UPDATED 
     ,STATUS_TYPE.STATUS_TYPE_NAME as 'Ticket Status' 
     ,a.STATUS_TYPE_ID AS 'status Id' 
     ,A.Close_Date 
     ,A.TECH_GROUP_ID 
     ,isnull(tech.lAST_NAME,'') + ' ' +isnull(Tech.FIRST_NAME,'') [Assigned Tech] 
     ,TECH_GROUP_LEVEL.LEVEL_NUMBER 

     ,DATEDIFF(MINUTE,a.LAST_UPDATED,getdate()) as 'greater than 72 hours' 
     ,TECH_GROUP.NAME 
     ,PRIORITY_TYPE_NAME 

----------------------------SLA---------------------------- 
,CAST ((sum(case WHEN datediff(minute,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Assigned to %%NOC%Level 2%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Assigned to %%NOC%Level 1%'))) <= 10   and 
datediff(MINUTE,(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.ENTRY_TEXT like ('%Escalated to %%NOC%Level 2%%') and HISTORY_ENTRY.ENTRY_TEXT not like ('%Escalated to %%NOC%Level 1%')), 
(select max(ENTRY_DATE) from history_entry where a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID and HISTORY_ENTRY.entry_text like '%Status changed from % to closed%%')) <= 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)*100.0)/COUNT(*) as money) as Percent_Compliant 
------------------------------JOINS--------------------------------------------------                     
From JOB_TICKET A 
Join cteFinalHier B on A.PROBLEM_TYPE_ID=B.PROBLEM_TYPE_ID 

INNER JOIN [SWHD01].[dbo].[PRIORITY_TYPE] ON A.[PRIORITY_TYPE_ID] = [PRIORITY_TYPE].[PRIORITY_TYPE_ID] 

INNER JOIN [SWHD01].[dbo].[STATUS_TYPE] ON A.[STATUS_TYPE_ID] = [STATUS_TYPE].[STATUS_TYPE_ID] 

    inner join [SWHD01].[dbo].TECH_GROUP_LEVEL on A.TECH_GROUP_LEVEL_ID=TECH_GROUP_LEVEL.ID 

join TECH_GROUP on TECH_GROUP.ID= TECH_GROUP_LEVEL.tech_group_id 



LEFT JOIN TECH on Tech.CLIENT_ID = A.ASSIGNED_TECH_ID 
join HISTORY_ENTRY on a.JOB_TICKET_ID=HISTORY_ENTRY.JOB_TICKET_ID 


Cross Apply (Select Top 1 * from cteFinalHier Where B.R1 between R1 and R2 and Lvl=1) C 

-------------Tickets for the Last 6 months--------------------------------------------------- 

where datediff(day, A.REPORT_DATE, getdate()) <= 30 
and TECH_GROUP.NAME like '%NOC%' 
and LEVEL_NUMBER ='2' 




Group By C.PROBLEM_TYPE_NAME,a.JOB_TICKET_ID,B.PROBLEM_TYPE_NAME,B.PROBLEM_TYPE_ID, a.REPORT_DATE,a.CLOSE_DATE,SWHD01.dbo.PRIORITY_TYPE.PRIORITY_TYPE_NAME,a.FIRST_RESPONSE_DATE,B.R1,a.LAST_UPDATED,a.STATUS_TYPE_ID,a.TECH_GROUP_ID,TECH_GROUP_LEVEL.LEVEL_NUMBER,TECH_GROUP.NAME,a.ASSIGNED_TECH_ID,HISTORY_ENTRY.ENTRY_DATE,HISTORY_ENTRY.ENTRY_TEXT,HISTORY_ENTRY.TECH_ID,TECH.LAST_NAME,TECH.FIRST_NAME,STATUS_TYPE.STATUS_TYPE_NAME 
Order By job_ticket_id desc 
+0

aussehen, wenn dies hilft ... http://StackOverflow.com/Questions/582637/sql-server-äquivalent-of-a-countif-aggregate-funktion – NicoRiff

+0

Ich habe dies versucht, aber es gibt mir diesen Fehler (Msg 130, Ebene 15, Status 1, Zeile 94 Kann keine Aggregatfunktion für einen Ausdruck mit einem Aggregat durchführen oder eine Unterabfrage.) – Kirk1993

Antwort

0

((sum (Fall, wenn datediff (Minute, (wählen Sie max (ENTRY_DATE) aus history_entry, wo a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID und HISTORY_ENTRY.ENTRY_TEXT wie ("% Escalated zu %% NOC% Level 2 %%") und HISTORY_ENTRY.ENTRY_TEXT nicht gefällt ('% Eskaliert zu %% NOC% Level 1% ')), (wählen Sie max (ENTRY_DATE) aus history_entry, wobei a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID und HISTORY_ENTRY.ENTRY_TEXT wie (%% NOC% Level 2% zugewiesen) und HISTORY_ENTRY.ENTRY_TEXT nicht wie (% zugewiesen zu %% N OC% Level 1% '))) < = 10 und datediff (MINUTE, (wählen Sie max (ENTRY_DATE) aus history_entry wobei a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID und HISTORY_ENTRY.ENTRY_TEXT wie ('% Eskaliert zu %% NOC% Level 2 %% ') und HISTORY_ENTRY.ENTRY_TEXT nicht ähnlich ('% Escalated zu %% NOC% Level 1% '), (Wählen Sie max (ENTRY_DATE) aus history_entry wobei a.job_Ticket_ID = HISTORY_ENTRY.job_Ticket_ID und HISTORY_ENTRY.entry_text wie'% Status geändert von% auf geschlossene %% ')) = < Fall PRIORITY_TYPE_NAME WHEN 'low' dann 960 WHEN 'mittel' dann 480 WHEN 'high' dann 120 WHEN 'dringend' dann 60 Ende dann 1 anderes 0
Ende) 100,0)/COUNT (*) < - Ich glaube, das sollte etwas wie (SELECT COUNT () VON ..... WHERE ...) als total_count sein, weil SUM (COUNT) ist es ungültig sollte SUM (1 Wert jeder Zeile) und nicht SUM (COUNT (jede Zeile) jeder Zeile) als Geld) als Percent_Compliant