2017-02-13 79 views
0

我試圖找到最多的天數(以及審閱者的徽章編號),它需要幾位審閱者之一批准工作流中的特定文檔。例如,我有一張表格,其中包含多個工作流程審批步驟(提交者,經理,控制員,質量保證),以及他們的徽章號碼和他們批准的日期。該表稱爲「工作流程」,並具有上述四個工作流程步驟作爲表格中的記錄,以及與工作流程具有一對多關係的主表格設計。SQL Server根據計算從多個行中選擇一個

我正在嘗試確定最長審閱步驟(天數)以及該步驟的審閱者(基本持有審批工作流程)的徽章編號。我一直在試圖設置獨立變量以供以後使用,但不知道如何設置徽章號碼,我很困惑。我已經嘗試過CASE,IIF和COALESCE,但沒有任何運氣,因爲我不想讓第一個真正的值返回,然後停下來,我希望它繼續評估所有步驟。這是我的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

你能提供ddl的一些測試數據嗎? – scsimon

回答

0

這是我會怎麼做:

與流動definiton創建表WorkflowDefinition:

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

現在,我們使用該表的加盟流程元素並計算最大天數:

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 
) 

當我們有這個值時,我們可以選擇歷時幾天的這個確切數字的所有工作流元素來完成:

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 

如果你想知道每一個類型的步驟天的最大值分別那麼我們可以做這樣的事情:計算每步天的最大值鍵入並把這個到臨時表:

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 

而現在使用此表來選擇匹配的步驟最多的天數和步說明:

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

Hi Tomasz,謝謝你非常周到的迴應。我從另一個角度看待了這個問題,並提出了一些SQL,並獲得了我之前的結果。我將發佈SQL作爲我自己問題的答案。 – Sherry

0

我結束了TACKL從「許多」表(Workflow)中取代Design表。我使用了下面的SQL,它給了我後面的結果。謝謝大家試圖理解我的漫步。

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 
相關問題