2011-09-07 4 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

아론 버트 랜드가 올바른 생각을 가지고있다. 끝으로 그룹을 정의해서는 안됩니다.

다음은 그룹으로 다시 작성된 쿼리입니다.

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

정답 (Aaron 's)보다 "gimme the code"가 정상이 아니지만 파생 된 열에 의한 그룹화는 sql에서 다소 고통 스럽습니다 (SELECT는 GROUP BY 이후 논리적으로 실행 됨). –

4

당신은 CIC.StatusDateTimeCIC.EndDateTime에 의해 그룹화하고 그냥 ... 시도 :

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

나는 여전히 같은 결과를 가지고 있습니다. 나는 나의 작전을 편집했고, 나는 중요한 정보를 생략했다. – Jessica

+0

"동일한 결과"란 사용자 당 여러 행이 여전히 존재한다는 것을 의미합니까, 아니면 MIN/MAX가 관심이있는 날에 속하지 않거나 또는 둘 다 아니면 둘 중 어느 것입니까? 다시 말하지만, 제 의견을 참조하십시오 - 샘플 데이터와 원하는 결과를 제공하십시오. 리버스 엔지니어링 단어 문제보다 훨씬 쉽습니다. –

+0

일부 데이터를 게시했습니다. 원하는 결과는 에이전트 당 1 일 1 행입니다. – Jessica

0

사용 ST_Date는 테이블의 열 이름이므로 group by에 있습니다.

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()'할 수 없습니다. 나는 새끼를 뽑으려고하지 않고, 당신이 제안한 것을 테스트 해 보았습니까? –