4

私はここで同様のシナリオを見つけましたが、完全には一致しませんでしたが、これを機能させるには運がありませんでした。これが重複した質問である場合はご容赦ください。間違いなく最初に検索しました。私は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 愛好家なので、気分を害する心配はありません。:-)

4

2 に答える 2

1

ジャズ、私があなたに送った電子メールをフォローアップして、提供されたサンプルデータに対して次を使用して、あなたが探している正しいデータポイントであると私が思うものを取得します:

declare @StartDate datetime
declare @EndDate datetime
declare @Engineer int

SET @StartDate = '01/01/13'
SET @EndDate = '01/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 AVG(first_response_time) from ( select A.*, DATEDIFF(minute, A.create_time, (
    select top 1 C.create_time
    from wh_time_item as B
        inner join wh_time_subitem as C on C.time_item_id = B.time_item_id
    order by C.create_time asc ) ) as first_response_time
from wh_task as A
    inner join wh_time_item as B on B.task_id = A.task_id
where A.source_id = 8
    and A.create_time between @StartDate and @EndDate
    and B.created_by_user_id = @Engineer
 ) as first_response_table

wh_time_item および wh_time_subitem に対するサブクエリは、create_time が常に w_task create_time の前後にあると想定していることに注意してください...これは確かな想定のようです。

于 2013-06-04T11:40:04.167 に答える
0

上記のクエリを使用していますか?

U know friend ...ステートメントでaggregate functionlikeAVG()を直接使用すると、このエラーが発生します。ON clauseこのような :

TableA join TableB on TableA.Code >= AVG(TableB.Code) 

上記のこのクエリには、あなたのようなエラーがあります

しかし今、あなたは in を持つことによってサブクエリを使用していますaggregate function、それは本当のようです. 私はあなたのクエリのこの部分を意味しました:

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]))

このリンクを見てください:リンクが役立つ場合があります

于 2013-05-31T10:26:07.917 に答える