我无法开发查询。
我有一张表,结构如下:
[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)
这是我到目前为止所提出的查询,但是这显示了特定日期的事件总数,但未包括根据有效日期和有效日期之间的日期继续的事件。
答案 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)
答案 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
希望这对你有所帮助。