2013-06-13 1 views
3

Je suis coincé en train de développer une requête.Nombre total d'événements à chaque date

J'ai une table, structuré comme celui-ci:

[EventId] [Description] [EventName] [ValidFrom] [ValidTo] [Approved] 
1   Sample1  1stEvent  2013-01-27 2013-05-10  1 
2   Sample2  2stEvent  2013-04-07 2013-06-15  1 
3   Sample3  3stEvent  2013-04-07 2013-06-15  1 
4   Sample4  4stEvent  2013-03-02 2013-05-29  1 
5   Sample5  5stEvent  2013-05-17 2013-07-10  1 
6   Sample6  6stEvent  2013-03-20 2013-05-11  1 

Ce que je veux est le nombre total d'événements pour chaque jour dans une plage de dates, y compris.

Select distinct 
    Convert(varchar,ValidFrom,101)as [Date], 
    case 
     when count(EventID)>1 then Convert(nvarchar, count(EventID)) +' Events' 
     else Convert(nvarchar, count(EventID)) + ' Event' 
     end as CountOf, 
    Row_Number() 
     over (Order By Convert(varchar,ValidFrom,101)) as RowNumber 
from [Table] 
where Approved=1 
group by Convert(varchar,ValidFrom,101) 

C'est la requête que je suis venu avec jusqu'à présent, mais cela montre le nombre total d'événements à une date donnée sans compter les événements qui ont été reconduits selon les dates entre valides de et valide pour les dates.

+0

Pouvez-vous fournir les résultats souhaités? Je ne suis pas sûr de comprendre ce que vous essayez d'accomplir. – sgeddes

+0

Donc vous voulez la somme basée sur l'EventId? –

+0

Je suis d'accord avec @sgeddes. Vous devez fournir quelques exemples de lignes de sortie que vous vous attendez à voir dans votre jeu de résultats. – STLDeveloper

Répondre

1

cela va faire.

declare @dateFrom date 
declare @dateTo date 
SET @dateFrom = '20130101' 
SET @dateTo = '20130501' 
;with cte as(Select @dateFrom AS EveryDay 
      UNION ALL 
      Select dateadd(dd, 1, EveryDay) FROM cte WHERE EveryDay < @dateTo) 
SELECT 
EveryDay, 
COUNT(DISTINCT [EventName]) AS NoEvents 
from cte LEFT JOIN Table1 ON ValidFrom <= EveryDay AND ValidTo >= EveryDay 
GROUP BY EveryDay 
OPTION (MAXRECURSION 0) 

SQL Fiddle

+0

hey cha, pouvez-vous partager le résultat de sortie? –

+0

J'ai fourni le Fiddle SQL pour jouer avec.Lorsque vous cliquez sur le bouton 'Exécuter SQL', vous verrez le résultat – cha

+0

ahhh tnx son travail sans elle mais une chose de plus que la requête ci-dessus n'inclut pas la condition Approuvée = 1 qui sert un résultat ambigu –

0

Cet exemple de code n'est pas complet - vous devez entrer les champs que vous devez afficher et regrouper. Il semble que vous cherchiez un résultat entre deux dates, et vous ne l'avez pas dans votre requête. Je ne suis pas sûr de comprendre complétement votre question.

DECLARE @pStartDate DATE 
DECLARE @pEndDate DATE 

SET @pStartDate = [enter your start date for the date range] 
SET @pEndDate = [enter your end date for the date range] 

SELECT 
    COUNT(EventId), 
    ValidFrom, 
    ValidTo 
FROM [Table] 
WHERE 
    ValidFrom >= @pStartDate 
    AND ValidTo <= @pEndDate 
    AND Approved = 1 
GROUP BY 
    ValidFrom, 
    ValidTo 
+0

bien oui je sais c'est pas complet c'est pourquoi demander de suggérer un moyen de réaliser, eh bien j'ai un contrôle de calendrier qui remplit le total des événements pour le compte des événements actifs, Above Query montre juste le total de l'événement basé sur le date particulière ne qui ne souhaite pas –

0

Avec la requête ci-dessus je l'ai mentionné donne le résultat comme celui-ci: -

Date CountOf RowNumber 
01/27/2013 2 Events 1 
03/02/2013 1 Event   2 
04/07/2013 2 Events 3 
05/17/2013 1 Event   4 

Comme vous pouvez le voir je reçois total des événements que sur la base de date particulière qui ne souhaite pas. Je veux afficher le résultat comme étant valide à partir du 01/27/2013 en vigueur jusqu'au 2013-05-10, ce qui signifie que dans le cas de Date = 2013-03-02 les événements doivent être incrémentés d'un ou le nombre d'événements qui sont actifs à cette date, de sorte que le résultat pour 02.03.2013 devrait être de 6 événements, je souhaite que je peux présenter une meilleure image, mais à cause de la complexité, il m'a fait vide :(

0
SELECT t1.EventId,t1.Description,t1.EventName,t1.ValidFrom,t1.ValidTo,t1.Approved,SUM(TotalEvent) FROM 
    (SELECT EventId,Description,EventName,ValidFrom,ValidTo,Approved,COUNT(EventId) as Total 
    FROM TABLE 
    WHERE Approved='1' AND ValidFrom >=(DATE) AND ValidTO<=(DATE) 
    GROUP BY EventId,Description,EventName,ValidFrom,ValidTo,Approved) AS t1 
    LEFT JOIN 
    (SELECT EventId, COUNT(EventId) as TotalEvent 
    FROM TABLE 
    WHERE ValidFrom >=(DATE) AND ValidTO<=(DATE)) AS t2 
    ON t1.EventId=t2.EventId 
    Group by t1.EventId,t1.Description,t1.EventName,t1.ValidFrom,t1.ValidTo,t1.Approved 

Espérons que cela vous aide

+0

oÙ ValidFrom> = (DATE) ET validTo <= (DATE)) AS t2 LEFT JOIN Je suppose que votre manque quelque chose ici que lors de l'exécution de son me donner l'erreur t1.EventId = t2.EventId Groupe par t1.EventId, t1.Description, t1.EventName, t1.ValidFrom, t1.ValidTo, t1 Essayé –

+0

Updated.try maintenant –

+0

Essayé il ne donne aucune ligne –

Questions connexes