2011-09-07 70 views
0

另外这里的新手问题,SQL选择不正确的分组

我有以下选择:

SELECT  
    DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)) AS ST_Date, 
    CIC.UserId, 
    MIN(CIC.StatusDateTime) as Beginning, 
    MAX(CIC.EndDateTime) as ending, 
    DATEPART(hour,MAX(CIC.EndDateTime) - MIN(CIC.StatusDateTime)) * 3600 
    + DATEPART(minute, MAX(CIC.EndDateTime) - MIN(CIC.StatusDateTime)) * 60 
    + DATEPART(second,MAX(CIC.EndDateTime) - MIN(CIC.StatusDateTime)) AS Login_Time, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 5 THEN StateDuration ELSE 0 END) AS Lunch, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 3 THEN StateDuration ELSE 0 END) AS Break_, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 4 THEN StateDuration ELSE 0 END) AS Coaching, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 10 THEN StateDuration ELSE 0 END) AS SYS_Down, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 7 THEN StateDuration ELSE 0 END) AS Training, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 6 THEN StateDuration ELSE 0 END) AS Meeting, 
    SUM(CASE WHEN RS.AGT_STATE_GRP = 11 THEN StateDuration ELSE 0 END) AS Default_ 
FROM dbo.CIC_AgentActivityLog_TMP AS CIC 
INNER JOIN dbo.REF_AGT_STATES AS RS 
ON CIC.StatusKey = RS.AGT_STATE_DESC 
Where CIC.StatusDateTime >='2011-09-01' 
GROUP BY CIC.StatusDateTime, CIC.UserId, CIC.EndDateTime 
ORDER BY ST_Date,UserID,StatusDateTime; 

利用这一点,我的成绩似乎并没有在所有分组。我想要的是带有日期,userid,firstlogin,lastlogin,totallogintime的单行,然后是一串代码,其持续时间以秒为单位。我有一个非常相似的另一个数据源工作正常。

我已经试过转换和使用与第一次日期思考最后00:00:00的演员阵容可能是冲突,但无济于事。我不确定你们可能需要的更多信息,请让我知道。 *编辑1 - 我的MIN(CIC.StatusDateTime)作为开始,MAX(CIC.EndDateTime)作为结束似乎没有帮助。对于代理商,我有三行,它们都有不同的开始和结束时间。最小和最大不会给我整天的实际最小和最大值。

这里是源数据:

userID StatusDateTime StatusKey EndDateTime StateDuration 
bBarsby 9/1/2011 11:36 Out of the office 9/1/2011 11:36 0 
bBarsby 9/1/2011 11:36 Out of the office 9/1/2011 11:36 5 
bBarsby 9/1/2011 11:36 Available 9/1/2011 14:18 9711 
bBarsby 9/1/2011 14:18 Away from desk 9/1/2011 14:39 1261 
bBarsby 9/1/2011 14:39 Available 9/1/2011 19:51 18693 
bBarsby 9/1/2011 19:51 Out of the office 9/1/2011 19:51 4 
bBarsby 9/1/2011 19:51 Out of the office 9/1/2011 19:51 0 

这是效果

ST_Date UserID Beginning Ending LoginTime Lunch Break Coaching  Etc. 
9/1/2011 0:00 bBarsby 9/1/2011 11:36 9/1/2011 14:18 9711 0 0 0 0 
9/1/2011 0:00 bBarsby 9/1/2011 14:18 9/1/2011 14:39 1261 0 0 0 0 
9/1/2011 0:00 bBarsby 9/1/2011 14:39 9/1/2011 19:51 18693 0 0 0 0 
+2

此外,您正在按StatusDateTime进行排序,但该列不在选择列表中。 –

+0

删除它,仍然有相同的结果。 – Jessica

+1

你能提供一些样本数据和期望的结果吗?当然,如果你使用'UserID'进行分组,那么'MIN'和'MAX'运营商不知道你想在一天之内停留。也许你的WHERE子句也应该说'''20110902'? –

回答

1

阿龙贝特朗有正确的想法。你绝对不应该在enddate中定义组。

下面是使用该组重新写入的查询。

SELECT 
    sub.ST_Date, 
    sub.UserId, 
    MIN(sub.StatusDateTime) as Beginning, 
    MAX(sub.EndDateTime) as ending, 
    DATEPART(hour,MAX(sub.EndDateTime) - MIN(sub.StatusDateTime)) * 3600 
    + DATEPART(minute, MAX(sub.EndDateTime) - MIN(sub.StatusDateTime)) * 60 
    + DATEPART(second,MAX(sub.EndDateTime) - MIN(sub.StatusDateTime)) AS Login_Time, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 5 THEN StateDuration ELSE 0 END) AS Lunch, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 3 THEN StateDuration ELSE 0 END) AS Break_, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 4 THEN StateDuration ELSE 0 END) AS Coaching, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 10 THEN StateDuration ELSE 0 END) AS SYS_Down, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 7 THEN StateDuration ELSE 0 END) AS Training, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 6 THEN StateDuration ELSE 0 END) AS Meeting, 
    SUM(CASE WHEN sub.AGT_STATE_GRP = 11 THEN StateDuration ELSE 0 END) AS Default_ 
FROM 
(
    SELECT 
    DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)) AS ST_Date 
    CIC.UserId, 
    CIC.StatusDateTime, 
    CIC.EndDateTime, 
    RS.AGT_STATE_GRP, 
    StateDuration 
    FROM 
    dbo.CIC_AgentActivityLog_TMP AS CIC 
    JOIN dbo.REF_AGT_STATES AS RS 
    ON CIC.StatusKey = RS.AGT_STATE_DESC 
    WHERE CIC.StatusDateTime >='2011-09-01' 
) sub 
GROUP BY sub.ST_Date, sub.UserId 
ORDER BY sub.ST_Date, sub.UserId 
+0

我不是正常的“给代码”一个正确的答案(亚伦的),但通过派生列分组是一种在sql中的痛苦(SELECT在逻辑上在GROUP BY之后运行)。 –

4

你被CIC.StatusDateTimeCIC.EndDateTime分组...尝试只是:

GROUP BY DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)), CIC.UserId 
+0

我仍然有同样的结果。我编辑了我的OP,我忽略了一些重要的信息。 – Jessica

+0

“同样的结果”是否意味着每个用户仍有多行,或者只有MIN/MAX超出您感兴趣的一天或两者之间或两者都不是?再次,请看我的评论 - 提供一些样本数据和期望的结果,这比反向工程问题要容易得多。 –

+0

我发布了一些数据。期望的结果是每个代理每天一行。 – Jessica

0

使用ST_Date分组为,因为这是表中的列名。

GROUP BY CIC.StatusDateTime, CIC.UserId, CIC.EndDateTime 
to 
GROUP BY CIC.ST_DATE, CIC.UserId, CIC.EndDateTime 

编辑:

group by DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)),CIC.UserId, MAX(CIC.EndDateTime) 
+1

您无法按“ST_Date”进行分组 - 此列不在表中,它只是“SELECT”列表中表达式的别名。 –

+3

你也不能'GROUP BY ... MAX()'。我不是在挑选尼特尼斯,但是你测试了你所建议的任何东西吗? –