J'ai une table d'éléments qui sont divisés sur un siteId et un statut.Récupération des données dépendant du temps Statistiques (décomptes) par indicateur, divisé sur l'ID étranger, sur plusieurs tables, retournées dans un jeu de données
CREATE TABLE ItemDetail (
ItemNumber long,
SiteId int,
Status int,
Created datetime
)
Et puis j'ai aussi une table de l'utilisateur
CREATE TABLE UserDetail (
UserId int,
Suspended int
)
Etat a 7 valeurs possibles (0-6) représentant les différentes files d'attente. Appelons cette variable x. Suspendu, ne devrait avoir que 0 (actif) ou 1 (suspendu). (Ne me demandez pas pourquoi c'est un int, je ne l'ai pas construit). Les données sont affichées par site dans un délai configurable. La valeur par défaut est 5 jours en arrière. Appelons cette variable a. Je veux revenir, dans un appel, un ensemble de données comme ceci:
ActiveUserCount int
SuspendedUserCount int,
Queue0Count int,
Queue0TodayCount int,
Queue1Count int,
Queue1TodayCount int,
...
Où QueueXCount est tout le dernier jour par un statut et siteid. QueueXTodayCount est tout avec le statut x qui s'est passé aujourd'hui. Jusqu'à présent, j'ai commencé un sproc comme celui-ci
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
Comme si cela ne suffit pas compliqué, je suis en utilisant Fluent NHibernate. Je ne suis pas contre l'utilisation d'un sproc si je dois le faire, mais j'ai envisagé de créer une vue avec les chiffres par jour, en utilisant nhibernate et une requête de sélection par date, puis en additionnant les quantités le cas échéant dans le code. J'ai juste le sentiment que je rends cela plus compliqué que je ne le dois. Il doit y avoir un meilleur moyen.