2017-02-13 3 views
0

Ich versuche, die größte Anzahl von Tagen (und die Ausweisnummer des Überprüfers) zu finden, die einen bestimmten Prüfer in einem Workflow genehmigte. Zum Beispiel habe ich eine Tabelle, die mehrere Workflow-Genehmigungsschritte (Übergeber, Manager, Controller, QA) zusammen mit ihren Ausweisnummern und dem Datum ihrer Genehmigung enthält. Die Tabelle heißt "Workflow" und enthält die oben genannten vier Workflowschritte als Datensätze in der Tabelle und die Haupttabelle Design, die eine Eins-zu-viele-Beziehung mit Workflow hat.SQL Server Wählen Sie eine aus mehreren Zeilen basierend auf der Berechnung

Ich versuche festzustellen, wie viele Tage für den längsten Überprüfungsschritt (Anzahl der Tage) und die Badge Nummer des Überprüfers für diesen Schritt (wer hält den Genehmigungs-Workflow, im Grunde). Ich habe versucht, unabhängige Variablen zu setzen, um später verwendet zu werden, aber nicht sicher, wie man die Ausweisnummer auch setzt und ich bin verwirrt. Ich habe versucht, CASE, IIF und COALESCE, aber ich habe kein Glück, weil ich nicht wollen, dass der erste wahre Wert zurückgegeben und dann aufhören, ich möchte es weiterhin alle Schritte zu bewerten. Hier ist ein Beispiel für meine SQL:

declare @managerTime int = 0 
    declare @controllerTime int = 0 
    declare @qaTime int = 0 

    SET @managerTime = (SELECT DATEDIFF(day, manager.BadgeDate, submitter.BadgeDate) 
    from Design d 
    left outer join Workflow submitter on (d.DCRId = submitter.DCRId and submitter.RoleName = 'Submitter') 
    left outer join Workflow manager on (d.DCRId = manager.DCRId and manager.RoleName = 'System Manager') 

    SET @controllerTime = (SELECT DATEDIFF(day, controller.BadgeDate, manager.BadgeDate) 
     from Design d 
     left outer join Workflow manager on (d.DCRId = manager.DCRId and manager.RoleName = 'System Manager') 
     left outer join Workflow controller on (d.DCRId = controller.DCRId and controller.RoleName = 'DCR Controller') 
+0

Können Sie dem ddl einige Testdaten zur Verfügung stellen? – scsimon

Antwort

0

Dies ist, wie ich es tun würde:

Tabelle WorkflowDefinition erstellen mit Fluss Definiton:

Source   Destination  Description 
Submitter  System Manager Submitter -> System Manager 
System Manager DCR Controller System Manager -> DCR Controller 
DCR Controller QA    DCR Controller -> QA 

Jetzt verwenden wir diese Tabelle Workflow-Elemente zu verbinden und berechnen größte Anzahl von Tagen:

SET @MaxTime = (SELECT MAX(DATEDIFF(day, source.BadgeDate, destination.BadgeDate)) 
    from Design d 
    inner join Workflow source on d.DCRId = source.DCRId 
    inner join WorkflowDefinition flow on source.RoleName = flow.source 
    inner join Workflow destination on d.DCRId = destination.DCRId 
    and destination.RoleName = flow.destination 
) 

Wenn wir diesen Wert haben, können wir auswählen Alle Workflow-Elemente, die diese genaue Anzahl der Tage gedauert haben:

Select 
    destination.BadgeNumber 
from Design d 
inner join Workflow source on d.DCRId = source.DCRId 
inner join WorkflowDefinition flow on source.RoleName = flow.source 
inner join Workflow destination on d.DCRId = destination.DCRId 
and destination.RoleName = flow.destination 
where DATEDIFF(day, source.BadgeDate, destination.BadgeDate) = @MaxTime 

Wenn Sie max-Wert von Tagen für jede Art von Schritt separat dann können wir tun, um so etwas wissen wollen: Berechnen Maximalwert von Tagen pro Schritt Typ und setzen diese in temporäre Tabelle:

SELECT 
    MAX(DATEDIFF(day, source.BadgeDate, destination.BadgeDate)) as maxDays, 
    flow.Description as StepDescription 
into #tmp 
from Design d 
inner join Workflow source on d.DCRId = source.DCRId 
inner join WorkflowDefinition flow on source.RoleName = flow.source 
inner join Workflow destination on d.DCRId = destination.DCRId 
and destination.RoleName = flow.destination 
group by flow.Description 

und nutzen jetzt diese Tabelle Schritte passende maximale Anzahl der Tage und Schritt-Beschreibung wählen:

Select 
    destination.BadgeNumber 
from Design d 
inner join Workflow source on d.DCRId = source.DCRId 
inner join WorkflowDefinition flow on source.RoleName = flow.source 
inner join Workflow destination on d.DCRId = destination.DCRId 
and destination.RoleName = flow.destination 
inner join #tmp on DATEDIFF(day, source.BadgeDate, destination.BadgeDate) = maxDays and StepDescription = flow.Description 
+0

Hallo Tomasz, Vielen Dank für Ihre sehr nachdenkliche Antwort. Ich habe dieses Problem aus einer anderen Perspektive betrachtet und etwas SQL gefunden, das die Ergebnisse liefert, nach denen ich gesucht habe. Ich werde den SQL als Antwort auf meine eigene Frage veröffentlichen. – Sherry

0

ich landete tackl Dies wird von der "Viele" -Tabelle (Workflow) anstelle der Design-Tabelle übernommen. Ich benutzte die folgende SQL, die mir die Ergebnisse brachte, nach denen ich suchte. Ich danke Ihnen allen, dass Sie versucht haben, meinen Worten Ausdruck zu verleihen.

select 
w.DesignId, 
w.RoleName, 
w.BadgeNumber, 
w.BadgeDate, 
DATEDIFF(day, 
    (select x.BadgeDate from Workflow x 
     where x.BadgeDate is not null 
     and x.DesignId = w.DesignId 
     and x.StepOrder = w.StepOrder - 1),  
    (select b.BadgeDate from Workflow b 
     where b.BadgeDate is not null 
     and b.DesignId = w.DesignId 
     and b.StepOrder = w.StepOrder)) 
as StepDuration, 
w.StepOrder, 
TotalDuration = DATEDIFF(day, 
    (select y.BadgeDate from Workflow y 
     where y.RoleName = 'Submitter' 
     and y.DesignId = w.DesignId),  
    (select v.BadgeDate from Workflow v 
     where v.RoleName = 'Approver' 
     and v.DesignId = w.DesignId)), 
d.VersionNumber, 
d.Title 
from Workflow w 
inner join Design d on d.DesignId = w.DesignId 
Verwandte Themen