3

我被困在开发查询中。

我有一张桌子,结构如下:

[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

4 回答 4

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小提琴

于 2013-06-13T05:45:00.813 回答
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
于 2013-06-13T03:58:07.213 回答
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

希望这对您有所帮助。

于 2013-06-13T04:39:45.417 回答
0

通过上面提到的查询,我得到了这样的结果:-

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

如您所见,我仅在不希望的特定日期的基础上获得总事件。

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

于 2013-06-13T04:24:45.807 回答