2013-11-26 40 views
1

我想將兩個查詢組合在一起,但由於它是datetime列,所以我遇到了麻煩。現在我有一個查詢,查找所有用戶+那裏最慢和最快的「段」時間,但我也需要找到下面的平均段時間是我現在使用的兩個查詢哪個工作,但我需要它在一個查詢我正在製作的報告。如何在使用datetime時將查詢與AVG查詢組合SQL 2008 R2

感謝

托馬斯·詹姆斯

DECLARE 
@vnuID int = 1212, 
@StartDate DateTime = '30/10/2013', 
@EndDate DateTime = '26/11/2013' 

SELECT DISTINCT usrFullName, MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS FastestUserSegmentTime, 
     MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS SlowestUserSegmentTime 
FROM tblTrace 
    INNER JOIN tblUsers ON usrID = tr_usrID 
WHERE tr_vnuID = @vnuID AND trFinish IS NOT NULL AND tr_usrID IS NOT NULL AND trObjectType LIKE 'Segment%' 
     AND trStart BETWEEN @StartDate AND @EndDate 
GROUP BY usrFullName 


SELECT AVG(TotalTime) AS AvgUserSegmentTime 
FROM (SELECT DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish) as 'TotalTime' 
     FROM tblTrace 
     WHERE tblTrace.trFinish IS NOT NULL AND tblTrace.trObjectType LIKE 'Segment%' AND tblTrace.tr_vnuID = @vnuID 
     AND tblTrace.trStart BETWEEN @StartDate AND @EndDate) as SubQuery 

回答

1

功能(即不優化),你可以使用這樣的事情:

DECLARE 
@vnuID int = 1212, 
@StartDate DateTime = '30/10/2013', 
@EndDate DateTime = '26/11/2013' 

SELECT usrFullName, FastestUserSegmentTime, SlowestUserSegmentTime, 
     (SELECT AVG(DateDiff(SECOND, tblTrace.trStart , tblTrace.trFinish)) 
     FROM tblTrace 
     WHERE tblTrace.trFinish IS NOT NULL AND tblTrace.trObjectType LIKE 'Segment%' AND tblTrace.tr_vnuID = @vnuID 
     AND tblTrace.trStart BETWEEN @StartDate AND @EndDate) as AvgUserSegmentTime 
FROM (
    SELECT usrFullName, 
      MIN(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS FastestUserSegmentTime, 
      MAX(CAST(tblTrace.trFinish - tblTrace.trStart AS TIME)) AS SlowestUserSegmentTime 
    FROM tblTrace 
     INNER JOIN tblUsers ON usrID = tr_usrID 
    WHERE tr_vnuID = @vnuID AND trFinish IS NOT NULL AND tr_usrID IS NOT NULL AND trObjectType LIKE 'Segment%' 
      AND trStart BETWEEN @StartDate AND @EndDate 
    GROUP BY usrFullName 
) coreData 

不過,我會認爲你想tr_usrID不在所有情況下都是空的?在這種情況下,你可以使用這個:

SELECT usrFullName, 
     CONVERT(TIME, DATEADD(s, MIN(SegmentTime))) as FastestUserSegmentTime, 
     CONVERT(TIME, DATEADD(s, MAX(SegmentTime))) as SlowestUserSegmentTime, 
     AVG(SegmentTime) as AvgUserSegmentTime 
    FROM (
    SELECT usrFullName, 
      DateDiff(SECOND, tblTrace.trStart, tblTrace.trFinish) as SegmentTime 
     FROM tblTrace INNER JOIN 
      tblUsers 
     ON usrID = tr_usrID 
    WHERE tr_vnuID = @vnuID 
     AND trFinish IS NOT NULL 
     AND tr_usrID IS NOT NULL 
     AND trObjectType LIKE 'Segment%' 
     AND trStart BETWEEN @StartDate AND @EndDate 
     ) coreData