2011-03-07 5 views
0

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.

Répondre

0

J'ai créé une vue à l'aide CTE et un pivot

CREATE VIEW [dbo].[SiteQueueDailyStatistics] 
AS 

WITH statCTE AS (
    SELECT 
     Count(ItemNumber)as ItemCount, 
     SiteId, 
     Status, 
     DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate)) AS ScanDay 
    FROM 
     ItemDetail 
    group by SiteId, Status, DATEADD(dd, 0, DATEDIFF(dd, 0, ScanDate)) 
) 

SELECT 
    SiteId, 
    ScanDay, 
    ISNULL([0], 0) AS Queue0, 
    ISNULL([1], 0) AS Queue1, 
    ISNULL([2], 0) AS Queue2, 
    ISNULL([3], 0) AS Queue3, 
    ISNULL([4], 0) AS Queue4, 
    ISNULL([5], 0) AS Queue5, 
    ISNULL([6], 0) AS Queue6 
FROM 
    statCTE 
PIVOT 
(
    SUM(ItemCount) 
    FOR [Status] IN ([0], [1], [2], [3], [4], [5], [6]) 
) 
AS p 


GO 

Et puis-je récupérer mes données et remplir un objet composite dans mon modèle qui contient les statistiques sur plusieurs tables.

2

Peut-être pouvez-vous l'utiliser.

declare @SiteId int = 1 
declare @Window int = 5 

declare @ToDay datetime = dateadd(d, datediff(d, 0, getdate()), 0) 
declare @CutOff datetime = dateadd(d, @Window, @ToDay) 
declare @Tomorrow datetime = dateadd(d, 1, @ToDay) 

select * from 
(
    select 
    sum(case when Suspended = 0 then 1 else 0 end) as ActiveUserCount, 
    sum(case when Suspended = 1 then 1 else 0 end) as SuspendedUserCount 
    from UserDetail 
    where 
    SiteId = @SiteId 
) as q1 cross join 
(
    select 
    sum(case when Status = 0 then 1 else 0 end) as Queue0Count, 
    sum(case when Status = 1 then 1 else 0 end) as Queue1Count, 
    sum(case when Status = 2 then 1 else 0 end) as Queue2Count, 
    sum(case when Status = 3 then 1 else 0 end) as Queue3Count, 
    sum(case when Status = 4 then 1 else 0 end) as Queue4Count, 
    sum(case when Status = 5 then 1 else 0 end) as Queue5Count, 
    sum(case when Status = 6 then 1 else 0 end) as Queue6Count, 
    sum(case when Status = 0 and Created < @Tomorrow then 1 else 0 end) as Queue0TodayCount, 
    sum(case when Status = 1 and Created < @Tomorrow then 1 else 0 end) as Queue1TodayCount, 
    sum(case when Status = 2 and Created < @Tomorrow then 1 else 0 end) as Queue2TodayCount, 
    sum(case when Status = 3 and Created < @Tomorrow then 1 else 0 end) as Queue3TodayCount, 
    sum(case when Status = 4 and Created < @Tomorrow then 1 else 0 end) as Queue4TodayCount, 
    sum(case when Status = 5 and Created < @Tomorrow then 1 else 0 end) as Queue5TodayCount, 
    sum(case when Status = 6 and Created < @Tomorrow then 1 else 0 end) as Queue6TodayCount 
    from ItemDetail 
    where 
    Created >= @ToDay and 
    Created < @CutOff 
) as q2 
Questions connexes