sql цикл по результатам / группировать по / сортировать - PullRequest
1 голос
/ 12 октября 2011

это продолжение вопроса из моего предыдущего поста

У меня есть следующий код, который будет запрашивать базу данных о том, когда наши агенты были зарегистрированы в определенный момент времени. Это хорошо работает для данного дня, но теперь мне нужно сделать это в течение выбранного периода времени. Я не уверен, где начать регулировать это! Мне нужны результаты, сгруппированные по дате и часу ... так что бы это выглядело следующим образом

date        hour    count
10/10/11    22      52
10/10/11    23      24
11/10/11    00      12
11/10/11    01      33

Таким образом, 24-часовой период будет отображаться для каждой даты в выбранном диапазоне.

ALTER procedure [dbo].[LoggedOnCountByHour]
    @DayToCheck datetime,
    @HelplineID int
as

select  dateadd(hour, N.number, @DayToCheck) as [date_hour], 
        DATEPART(hh,dateadd(hour, N.number, @DayToCheck)) as [Hour],
        count(L.ExpertRecID) as [count of users]
from master..spt_values as N
  left outer join WorkDetail as L
    on L.KickedOffTime > dateadd(hour, N.number, @DayToCheck) and
       L.LoginTime < dateadd(hour, N.number + 1, @DayToCheck)
left join PoolMembership P on P.ExpertRecID = L.ExpertRecID

where N.Type = 'P' and
      N.Number between 0 and 23 and
      P.HelplinePoolID = @HelplineID 
group by dateadd(hour, N.number, @DayToCheck), DATEPART(hh,dateadd(hour, N.number, @DayToCheck) )

есть идеи? Большое спасибо

1 Ответ

0 голосов
/ 12 октября 2011

Примерно так (не проверено)

alter procedure [dbo].[LoggedOnCountByHour]
        @FromDayToCheck datetime,
        @ToDayToCheck datetime,
        @HelplineID int
as

select  dateadd(hour, N.number, @FromDayToCheck) as [date_hour], 
        DATEPART(hh,dateadd(hour, N.number, @FromDayToCheck)) as [Hour],
        count(L.ExpertRecID) as [count of users]
from master..spt_values as N
  left outer join WorkDetail as L
    on L.KickedOffTime > dateadd(hour, N.number, @FromDayToCheck) and
       L.LoginTime < dateadd(hour, N.number + 1, @FromDayToCheck)
  left join PoolMembership P on P.ExpertRecID = L.ExpertRecID

where N.Type = 'P' and
      dateadd(hour, N.number + 1, @FromDayToCheck) <= @ToDayToCheck + 1 and
      P.HelplinePoolID = @HelplineID 
group by dateadd(hour, N.number, @FromDayToCheck), DATEPART(hh,dateadd(hour, N.number, @FromDayToCheck) )
order by [date_hour], [Hour]

Примечание. Если вы считаете, что ваш временной интервал превышает 2048 часов, вам следует использовать таблицу чисел вместо master..spt_values.

...