2016-07-31 9 views
0

Wie gruppiere ich nach Ergebnis des ursprünglichen Ergebnisses und Rückgabe in einer select Select-Abfrage?Wie gruppiere ich nach Ergebnis des ursprünglichen Ergebnisses und Rückgabe in einer select Select-Abfrage?

Ich habe eine Tabelle #t mit Bill Id und Fehler es ging durch seinen Workflow-Zyklus. Eine Rechnungs-ID könnte mehrere Male den gleichen Fehlertyp oder einen anderen Fehlertyp durchlaufen haben.

Ich möchte verschiedene Fehlertyp für jede Rechnungs-ID auswählen und erhalten die Gruppe nach Anzahl der Fehler.

Basierend auf verschiedenen Fehlern, Fehleranzahl, muss ich die Anzahl der Fehlertypen und den Fehlertyp in derselben Tabelle abrufen.

Ich bin mir nicht sicher, wie das geht. Ich habe die Beispielabfrage und das erwartete Ergebnis in diesem Beitrag gespeichert.

create table #t 
(
    BillId int, 
    StepName varchar(100), 
    StepExec varchar(100), 
    StepExecResult varchar(100), 
    Created_date datetime 
) 

insert into #t 
values 
    (1, 'Initiated', 'Taken Place','Pass', getdate()-10), 
    (1, 'POS', 'Deadlock Error','Error', getdate()-9), 
    (1, 'POS', 'Processed','Pass', getdate()-9), 
    (1, 'Merchandise', 'Taken Place','Pass', getdate()-8), 
    (1, 'verification', 'Webservice call error','Error', getdate()-7), 
    (1, 'verification', 'Webservice call error','Error', getdate()-6), 
    (1, 'verification', 'Webservice call','Pass', getdate()-5), 
    (1, 'verification', 'Webservice Response','Error', getdate()-5), 
    (1, 'verification', 'Webservice Response','Pass', getdate()-5), 
    (1, 'verification', 'Timeout Error','Error', getdate()-5), 
    (1, 'verification', 'Timeout Error','Error', getdate()-5), 
    (1, 'verification', 'Timeout Error','Error', getdate()-5), 
    (1, 'verification', '','Pass', getdate()-5), 
    (1, 'Payment', 'calculationError','Error', getdate()-4), 
    (1, 'Payment', 'calculationProcessed','Pass', getdate()-3), 
    (1, 'Completed', 'Archived','Pass', getdate()-1), 
    (2, 'Initiated', 'Taken Place','Pass', getdate()-10), 
    (2, 'POS', 'Deadlock Error','Error', getdate()-9), 
    (2, 'POS', 'Processed','Pass', getdate()-9), 
    (2, 'Merchandise', 'Taken Place','Pass', getdate()-8), 
    (2, 'verification', 'Webservice call error','Error', getdate()-7), 
    (2, 'verification', 'Webservice call error','Error', getdate()-6), 
    (2, 'verification', 'Webservice call','Pass', getdate()-5), 
    (2, 'verification', 'Webservice Response','Error', getdate()-5), 
    (2, 'verification', 'Webservice Response','Pass', getdate()-5), 
    (2, 'verification', '','Pass', getdate()-5), 
    (2, 'Payment', 'calculationProcessed','Pass', getdate()-3), 
    (2, 'Completed', 'Archived','Pass', getdate()-1) 

select * 
from #t 
order by Created_date desc 

select * 
from #t 
where StepExecResult = 'Error' 

;With cte as 
(
    select 
     *, 
     row_number() over (partition by Billid,StepExec order by StepExecResult) as rownum 
    from 
     #t 
    where 
     StepExecResult = 'Error' 
) 
select * 
from cte 
where rownum = 1 

select 
    stepname, count(*) as ErrorCount 
from 
    #t 
where 
    StepExecResult = 'Error' 
group by 
    stepname 

Erwartete Ausgabe

StepName  TotalStepError  ErrorType  ErrorTypeCount 
-------------------------------------------------------------- 
Payment    1   calculationError  1 
POS     2   Deadlock Error   2 
verification  5   Timeout Error   1 
verification  5   Webservice Response  2 
verification  5   Webservice call error 2 

Antwort

1

Sie können eine unterschiedliche Anzahl der BillId von Stepname und StepExec .. für ErrorTypeCount gruppiert bekommen dann nur Fensterfunktion verwenden, um diese Zählung pro Stepname zusammenzufassen

SELECT StepName , 
     SUM(COUNT(DISTINCT BillId)) OVER (PARTITION BY StepName) TotalStepError, 
     StepExec , 
     COUNT(DISTINCT BillId) ErrorTypeCount 
FROM #t 
WHERE StepExecResult = 'Error' 
GROUP BY StepName, 
     StepExec 
+0

Danke Jamie. Das ist so hilfreich ..! – goofyui

Verwandte Themen