2010-05-26 58 views
2

我有包含CMS_STARTTIME和CMS_STOPTIME(附件)的CMS表。
alt text http://img339.imageshack.us/img339/755/exdatabase.jpg用SQL語句彙總數據

我想通過使用日期,時間和年份作爲參數(附件)創建報告以彙總存在的數據。
alt text http://img444.imageshack.us/img444/3508/reportdailyen.jpg

我不知道如何創建sql語句來滿足這個要求。我正在使用MySQL和MS-SQL。 有人可以幫忙嗎?
非常感謝。

+0

我的意思是參數日期,月和年(在附件「24/20/2009」是我錯了,它可能是「24/03/2009」 )。 – wearetherock 2010-05-26 16:29:25

回答

3

下面是用於SQL Server

SELECT 
DATEPART(hh,CMS_StartTime) AS HourOfDay, 
COUNT(*)    AS NumMsgs, 
SUM(DATEDIFF(mi,CMS_StartTime,CMS_STOPTIME)) AS TotalTimeInMinutes, 
AVG(DATEDIFF(mi,CMS_StartTime,CMS_STOPTIME)) AS AvgTimeBetweenInMinutes 
FROM 
     MyTable 
WHERE CMS_StartTime 
     BETWEEN 'may 1 2010' AND 'may 2 2010' 
GROUP BY 
     DATEPART(hh,CMS_StartTime) 
+0

非常感謝。你似乎缺少總時間。 – wearetherock 2010-05-26 17:05:24

2

一個解決方案,使這項工作,你需要一個數字或帳簿桌包含從零開始的整數的順序列表。在我的例子,我的號碼錶如下所示:

Create Table Numbers (Value int not null primary key) 

使用和SQL Server這樣做,你可以這樣做:

Select N.Value As [Hour] 
    , Count(T.StartDate) As CallCount 
    , Sum(DateDiff(mi, T.StartDate, T.EndDate)) As [TotalTime(mi)] 
    , Avg(DateDiff(mi, T.StartDate, T.EndDate)) As [AvgTime(mi)] 
From Numbers As N 
    Left Join Table As T 
     On DatePart(hh, T.StartDate) = N.Value 
Where N.Value Between 0 And 23 
Group By N.Value 

既然你沒有指定,我認爲一個電話如果它在那個小時開始,則在給定小時內計數。如果一個參數在一個小時內開始或結束,可能會造成重複計數,但會告訴您在一天的給定時間內有多少個呼叫正在進行中,因此一個參數可能會在一個小時內計數。爲此,需要更改上面的查詢以將以下內容添加到On子句Or DatePart(hh, T.EndDate) = N.Value

我相信MySQL的等效是:

Select N.Value As [Hour] 
    , Count(T.StartDate) As CallCount 
    , Sum(TimestampDiff(MINUTE, T.StartDate, T.EndDate)) As [TotalTime(mi)] 
    , Avg(TimestampDiff(MINUTE, T.StartDate, T.EndDate)) As [AvgTime(mi)] 
From Numbers As N 
    Left Join Table As T 
     On Hour(T.StartDate) = N.Value 
Where N.Value >= 0 And N.Value <= 23  
Group By N.Value