2017-02-13 12 views
0

ワークフロー内の特定のドキュメントを承認するために複数の査読者のうちの1人が取った最も長い日数(および校閲者のバッジ番号)を見つけようとしています。たとえば、バッジ番号と承認された日付とともに、いくつかのワークフロー承認手順(サブミッター、マネージャー、コントローラー、QA)を保持するテーブルがあります。テーブルは「ワークフロー」と呼ばれ、上記の4つのワークフローステップがテーブルのレコードとして、ワークフローと1対多の関係を持つメインテーブルデザインがあります。SQL Server計算に基づいて複数の行から1つを選択します

私は、最も長いレビューステップ(日数)の日数と、そのステップのレビューアのバッジ番号(基本的に承認ワークフローを保持している)を決定しようとしています。後で使用する独立変数を設定しようとしていましたが、バッジ番号を設定する方法がわからず、混乱しています。私は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

こんにちはトマシュ、あなたの非常に思いやりのある応答に感謝します。私は別の観点からこの問題を調べることになってしまい、その後の結果を得たSQLを思いついた。私は自分の質問に対する答えとしてSQLを掲示します。 – Sherry

0

私はtacklを終わりましたこれを「多くの」表(ワークフロー)から、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 
関連する問題