【问题标题】:Total number of Events on every date每个日期的事件总数
【发布时间】:2013-06-13 03:36:08
【问题描述】:

我一直在开发一个查询。

我有一张表,结构如下:

[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)

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

【问题讨论】:

  • 你能提供想要的结果吗?不确定我是否理解您要完成的工作。
  • 所以你想要基于 EventId 的总和是吗?
  • 我同意@sgeddes。您应该提供一些您希望在结果集中看到的示例输出行。

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


【解决方案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

【讨论】:

  • 嗯,是的,我知道它不完整,这就是为什么要求提出任何实现方法的原因,我有一个日历控件,它代表它上面的活动事件填充总事件,上面的查询只是仅根据不希望的特定日期显示事件总数
【解决方案2】:

这样就可以了:

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

【讨论】:

  • 嘿茶,你能分享一下输出结果吗?
  • 我提供了 SQL Fiddle 供您使用。当您单击Run SQL 按钮时,您将看到结果
  • ahhh tnx 它在没有它的情况下工作,但还有一件事是上述查询不包括 Approved=1 提供模糊结果的条件
  • 我猜你可以自己做。只需在 GROUP BY 子句之前直接添加 WHERE Approved=1 行。我刚刚为您提供了遵循的方向:即首先为指定日期范围内的每一天创建一个 cte,然后计算每天分组的事件数
  • 是的,我已经完成了,但结果仍然模棱两可,就像您在 2013-03-02 看到的一样,它仅显示 1 个事件,应该超过 1 个
【解决方案3】:

我提到的上述查询给出了这样的结果:-

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 个事件,我希望我能呈现更好的画面,但由于复杂性,它让我空白:(

【讨论】:

    【解决方案4】:
    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
    

    希望对您有所帮助。

    【讨论】:

    • WHERE ValidFrom >=(DATE) AND ValidTO
    • 试一试,确保你能做到。
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多