2012-12-25 120 views
0

当我运行这个(SQL Server 2008 R2中):分组/聚合在SQL Server 2008 R2

SELECT [UserId] 
     ,[StateDuration] 
     ,[StatusKey] 
FROM [AgentActivityLog] 
WHERE [StatusDateTime] between '2012-01-01' and '2012-12-31' 

我得到每个用户ID一排这样的: 用户ID StatusDateTime StatusKey

cfrinco  3456 Meeting 
echartl  23456 Available 
mbarbewar 3256 Lunch 
bsantiago 46565 Available 
bsantiago 79  Follow Up 
fburger  5464 Available 

哪告诉我几秒钟内每个用户处于每种状态的时间。

当然,每个日期每UserId会有很多条目。 换句话说,用户,在一天内,从可用到会议为可用以午饭可用等

我想要做的总时间(秒)每UserId,每StatusKey是,每个日历日。所以它看起来像这样:

cfrinco  3456 Meeting  '2012-01-01' 
cfrinco  45678 Available  '2012-01-01' 
cfrinco  7845 Meeting  '2012-01-02' 
cfrinco  32541 Available  '2012-01-02' 
cfrinco  4455 Meeting  '2012-01-03' 
cfrinco  12456 Available  '2012-01-03' 
fburger  3456 Meeting  '2012-01-01' 
fburger  75489 Available  '2012-01-01' 
fburger  3541 Lunch   '2012-01-01' 
fburger  5486 Meeting  '2012-01-02' 
fburger  64587 Available  '2012-01-02' 
fburger  3614 Lunch   '2012-01-02' 
fburger  3225 Meeting  '2012-01-03' 
fburger  35414 Available  '2012-01-03' 
fburger  3745 Lunch   '2012-01-03' 

您的帮助是非常感谢。

回答

0

这就是我一直在寻找。在对stackoverflow中的不同答案进行了一些研究并将它们放在一起之后,我得到了它。

SELECT 
UserId, SUM(StateDuration) SumStateDuration, StatusKey, 
DATEADD(dd, 0, DATEDIFF(dd, 0, StatusDateTime)) StatusDate 
FROM [AgentActivityLog] 
WHERE StatusDateTime BETWEEN '2012-01-01' AND '2012-12-31' 

GROUP BY 
UserId, 
DATEADD(dd, 0, DATEDIFF(dd, 0, StatusDateTime)), 
StatusKey 

的关键部分是 (a)以得到公正的日期出datetime列和(b)组。

1

如果要通过用户ID,状态和日期分组数据,然后做一些事情,如:

SELECT 
UserId 
SUM(StateDuration), 
StatusKey, 
StatusDateTime 
FROM AgentActivityLog 
WHERE StatusDateTime BETWEEN '2012-01-01' AND '2012-12-31' 
GROUP BY 
UserId, 
StatusDateTime, 
StatusKey 
+0

对不起,我不清楚。每个日期每个'UserId'都会有很多条目。换句话说,一天中的用户将从可用到会议到可用到午餐到可用等。谢谢! – Amarundo