siteId とステータスで分割されたアイテムのテーブルがあります。
CREATE TABLE ItemDetail (
ItemNumber long,
SiteId int,
Status int,
Created datetime
)
そして、ユーザーのテーブルもあります
CREATE TABLE UserDetail (
UserId int,
Suspended int
)
ステータスには、異なるキューを表す 7 つの可能な値 (0 ~ 6) があります。この変数を x としましょう。サスペンド。0 (アクティブ) または 1 (サスペンド) のみが必要です。(なぜ int なのか聞かないでください。私は作成していません)。データは、構成可能な時間枠でサイトごとに表示されます。デフォルトは 5 日前です。この変数を a としましょう。1回の呼び出しで、次のようなデータセットを返したい:
ActiveUserCount int
SuspendedUserCount int,
Queue0Count int,
Queue0TodayCount int,
Queue1Count int,
Queue1TodayCount int,
...
QueueXCount は、ステータスとサイト ID ごとの過去 1 日間のすべてです。QueueXTodayCount は、今日発生したステータス x のすべてです。これまでのところ、このようなsprocを開始しました
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 とクエリを使用して日付範囲で選択し、コードで適切な金額を合計することを検討しました。
私はこれを必要以上に複雑にしていると感じています。もっと良い方法があるはずです。