每天打开票务计数

时间:2015-02-26 15:08:32

标签: sql sql-server

我有一张看起来像这样的表

id | Submit_Date | Close_Date
------------------------------
 1 | 2015-02-01  | 2015-02-05
 2 | 2015-02-02  | 2015-02-04
 3 | 2015-02-03  | 2015-02-05
 4 | 2015-02-04  | 2015-02-06
 5 | 2015-02-05  | 2015-02-07
 6 | 2015-02-06  | 2015-02-07
 7 | 2015-02-07  | 2015-02-08

我可以计算一下特定日期开放的票数:

Select count(*) from tickets where '2015-02-05' BETWEEN Submit_Date and Close_Date

这给了我4,但我需要一个月中每一天的这个数。我不想写30个查询来处理这个问题。有没有办法捕获多天的故障?

4 个答案:

答案 0 :(得分:1)

我使用@Heinzi的解决方案与来自Generate a resultset of incrementing dates in TSQL

的技巧混合创建了一个解决方案
declare @dt datetime, @dtEnd datetime
set @dt = getdate()
set @dtEnd = dateadd(day, 100, @dt)

SELECT dates.myDate,
   (SELECT COUNT(*) 
      FROM tickets 
     WHERE myDate BETWEEN Submit_Date and Close_Date
   )
FROM 
(select Dates_To_Checkselect dateadd(day, number, @dt) mydate
from 
    (select distinct number from master.dbo.spt_values
     where name is null
    ) n
where dateadd(day, number, @dt) < @dtEnd) dates

代码是从记忆中合并而来的,我没有把它放在我面前所以可能会有一些拼写错误

答案 1 :(得分:0)

首先,您需要一个包含您要检查的每个日期的表格。您可以使用临时表。我们假设此表名为Dates_To_Check并且有一个字段myDate

SELECT myDate,
       (SELECT COUNT(*) 
          FROM tickets 
         WHERE myDate BETWEEN Submit_Date and Close_Date)
  FROM Dates_To_Check

或者,您可以create a huge table containing every possible date并使用WHERE子句将日期限制为您感兴趣的人。

答案 2 :(得分:0)

如果您使用的是SQL Server 2012或更高版本,您可以使用窗口函数执行此操作,其中一个小技巧,您可以在开放日期-1到结束日期添加1,然后执行此总额的运行总计:

select distinct date, sum(opencnt) over (order by date) from (
  select 
    Submit_Date as date, 
    1 as opencnt 
  from 
    ticket

  union all

  select 
    dateadd(day, 1, Close_Date), 
    -1
  from 
    ticket  
) TMP

有一个dateadd + 1天来包含当天的截止日期

答案 3 :(得分:0)

您可以生成日期列表,然后检索日期集中每个日期的计数。

cte部分从年初开始生成日期列表(ssumption),下一部分从数据集中计算出计数。

with cte as
    (select cast('2015-01-01' as date) dt // you should change this part to the correct start date
    union all
    select dateadd(DD,1,dt) dt from cte
    where dt<getdate()
    )
    select count(*)
    from tickets
    inner join cte
    on cte.dt between Submit_Date and Close_Date
    group by cte.dt