У меня есть таблица элементов, которые разделены на siteId и статус.
CREATE TABLE ItemDetail (
ItemNumber long,
SiteId int,
Status int,
Created datetime
)
И еще у меня есть таблица пользователя
CREATE TABLE UserDetail (
UserId int,
Suspended int
)
Статус имеет 7 возможных значений(0-6), представляющие различные очереди.Давайте назовем эту переменную х.Приостановлено, должно иметь только 0 (активный) или 1 (приостановленный).(не спрашивайте меня, почему это int, я его не строил).Данные отображаются для каждого сайта в настраиваемом периоде времени.По умолчанию 5 дней назад.Давайте назовем эту переменную а.Я хочу вернуть за один вызов набор данных, подобный следующему:
ActiveUserCount int
SuspendedUserCount int,
Queue0Count int,
Queue0TodayCount int,
Queue1Count int,
Queue1TodayCount int,
...
Где QueueXCount - это все за последние сутки по статусу и идентификатору сайта.QueueXTodayCount - это все со статусом x, которое произошло сегодня.До сих пор я запустил такой процесс
CREATE PROCEDURE GetSiteStatistics
@SiteId int,
@Window int
AS
BEGIN
DECLARE @Today datetime
DECLARE @Tomorrow datetime
DECLARE @CutOff datetime
SET @Today = (CAST(YEAR(getdate()) as varchar) +
RIGHT('00' + CAST(MONTH(getdate()) as varchar), 2) +
RIGHT('00' + CAST(DAY(getdate()) as varchar), 2))
SET @Tomorrow = DATEADD(dd, 1, @Today)
SET @CutOff = DATEADD(dd, @Window + 1, @Today)
DECLARE
@SuspendedUserCount int,
@ActiveUserCount int,
@Queue0Count int,
@Queue0TodayCount int,
...
SELECT @SuspendedUserCount = count(UserId) FROM UserDetail WHERE Suspended = 1 AND SiteId = @SiteId
SELECT @ActiveUserCount = count(UserId) FROM UserDetail WHERE Suspended = 0 AND SiteId = @SiteId
SELECT @Queue0Count = count(ItemNumber) FROM ItemDetail WHERE Status = 0 AND SiteId = @SiteId AND Created >= @Today AND Created < @CutOff
SELECT @Queue0TodayCount = count(ItemNumber) FROM ItemDetail WHERE Status = 0 AND SiteId = @SiteId AND Created >= @Today AND Created < @Tomorrow
...
SELECT @SuspendedUserCount AS SuspendedUsers, @ActiveUserCount AS ActiveUsers, @Queue0Count AS Queue0, @Queue0TodayCount AS @Queue0Today...
END
Как будто это не достаточно сложно, я использую Fluent Nhibernate.Я не против использования sproc, если это необходимо, но я рассмотрел создание представления с подсчетами по дням, используя его с помощью nhibernate и запроса для выбора по диапазону дат, а затем суммируя суммы, где это необходимо, в коде.
У меня просто ощущение, что я делаю это более сложным, чем нужно.Должен быть лучший способ.