每个日期的活动总数

时间:2013-06-13 03:36:08

标签: sql sql-server sql-server-2008 sqlite tsql

我无法开发查询。

我有一张表,结构如下:

[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

我想要的是日期范围内每个日期的事件总数,包括在内。

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)

这是我到目前为止所提出的查询,但是这显示了特定日期的事件总数,但未包括根据有效日期和有效日期之间的日期继续的事件。

4 个答案:

答案 0 :(得分:1)

此代码示例未完成 - 您需要输入需要显示和聚合的字段。听起来你正在寻找两个日期之间的结果,而你的查询中却没有。我不确定我是否理解你的问题。

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

答案 1 :(得分:1)

这样做:

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

答案 2 :(得分:0)

通过上面提到的Query,我提到的结果如下: -

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

正如您所看到的,我只是在特定日期的基础上获得了不完整的事件。

我希望将结果显示为有效的从2013年10月27日到2013-05-10的有效期,这意味着在Date = 2013-03-02的情况下,事件应该增加1或者在那个日期活动的事件数量,所以2013-03-02的结果应该是6个事件,我希望我能呈现更好的画面,但由于它的复杂性让我空白:(

答案 3 :(得分: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

希望这对你有所帮助。