SQL Select не группирует должным образом - PullRequest
0 голосов
/ 07 сентября 2011

Еще один вопрос новичка здесь,

У меня есть следующий выбор:

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;

Используя это, мои результаты, похоже, не группируются вообще. Я пытаюсь получить единственную строку с датой, идентификатором пользователя, firstlogin, lastlogin, totallogintime, а затем набором кодов с их продолжительностью в секундах. У меня есть что-то очень похожее для другого источника данных, который работает нормально.

Я пытался преобразовать и использовать приведение с первым свиданием, думая, что 00:00:00 в конце может быть противоречивым, но безрезультатно. Я не уверен, какая дополнительная информация вам может понадобиться, просто дайте мне знать.

* Edit1 - Мой 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

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

Вы группируете по CIC.StatusDateTime и CIC.EndDateTime ... попробуйте просто:

GROUP BY DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)), CIC.UserId
1 голос
/ 07 сентября 2011

Аарон Бертран имеет правильную идею.Вы абсолютно не должны определять группы по конечной дате.

Вот запрос, переписанный для этой группы с помощью.

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 голосов
/ 07 сентября 2011

использовать ST_Date в группе, так как это имя столбца в вашей таблице.

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

Edit:

group by DATEADD(dd, 0, DATEDIFF(dd, 0, CIC.StatusDateTime)),CIC.UserId, MAX(CIC.EndDateTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...