私はここで同様のシナリオを見つけましたが、完全には一致しませんでしたが、これを機能させるには運がありませんでした。これが重複した質問である場合はご容赦ください。間違いなく最初に検索しました。私は3つのテーブルを持っています。最初の A は、ヘルプ デスク チケットのリストです。2 番目の B は、時間エントリのリストです。3 番目の C は、2 番目の時間エントリに関する詳細です。A の各アイテムに対して、B には複数のアイテムが存在する可能性がありますが、B の各アイテムに対して、C のエントリは 1 つだけです。
Aとしてのw_task
task_id create_time source_id
======== ============ ==========
1351000 2013-01-23 12:03:23.590 8
1351001 2013-01-23 13:03:23.590 5
1351002 2013-01-23 15:03:23.590 8
Wh_time_item as B
task_id time_item_id created_by_user_id
======== ============ =================
1351000 2456 1234567
1351000 2457 2345786
1351000 2458 1234567
Cとしてのw_time_subitem
time_item_id create_time
======== ============
2456 2013-01-23 12:43:23.590
2457 2013-01-25 13:13:23.590
2458 2013-02-12 16:03:23.590
高レベルの目標 - 特定の日付範囲内で、エンジニアごとに各チケットの平均 FIRST 応答時間を決定します。
具体的には - 最初に、@StartDate と @EndDate の間に作成された A 内のすべてのアイテムを検索します。次に、source_id = 8 である A 内のすべてのアイテムを見つけます (これらは、私が気にかけている唯一のチケットです)。次に、B のどのアイテムが「最初の」エントリであるか、つまり A のアイテムの作成に最も近い日付を見つける必要があります。テーブル B には作成日がありませんが、それは C にあります。 「最初」だった B のアイテム。created_by_user_id が @Engineer と一致するかどうかを確認する必要があります。最後に、すべての一致について、a.create_time と c.create_time の間の日付差の平均 (分単位) が必要です。AVERAGE(DATEDIFF(MI, a.create_time, c.createtime) as ResponseTime.
過去 2 日間で数十回の反復を実行しました。現在の壊れたクエリを次に示します。このクエリは、実行できたとしても、必要なものが得られないことを知っています-トラブルシューティングのために追加の列を取得するためにいじっています:
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Engineer integer
SET @StartDate = '04/01/13'
SET @EndDate = '04/30/13 23:59:59'
SET @StartDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @StartDate)
SET @EndDate = DATEADD(S, (DateDiff(s, getdate(), getutcdate())), @EndDate)
SET @Engineer = 1234567
SELECT [task_number]
,a.[create_time]
,DateDiff(MI, a.create_time, c.create_time) as a_responsetime
,b.user_id
,c.[time_subitem_id]
,a.ticket_source_id
FROM [databasename].[dbo].[wh_task] as a
LEFT JOIN [databasename].[dbo].[wh_time_item] AS b
ON a.task_id = b.task_id
LEFT JOIN [[databasename].[dbo].[wh_time_subitem] AS c
ON b.time_item_id = (SELECT c.time_item_id from [databasename].[dbo].[wh_time_subitem] WHERE c.create_time = (SELECT MIN(c.create_time) from [databasename].[dbo].[wh_time_subitem]))
WHERE
b.user_id = @Engineer
AND a.ticket_source_id = 8
AND c.create_time between @StartDate and @EndDate
ORDER BY a.ticket_source_id
ご協力いただきありがとうございます。私はせいぜい SQL 愛好家なので、気分を害する心配はありません。:-)