【问题标题】:Open Ticket Count Per Day每天开放票数
【发布时间】:2015-02-26 15:08:31
【问题描述】:

我有一张像这样的表

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 个查询来处理这个问题。有没有办法按多天截取?

【问题讨论】:

  • 你可以构建一个循环,在
  • 嗯...我想我可以,我只是似乎应该有一种方法可以在单个查询中处理这个问题。
  • 我只能想到存储过程。或者使用 Excel 填充 30 行。
  • @TZHX 我做了循环,但它给了我 30 个不同的结果集,而不是把它们放在一个结果集中。
  • 是的...使用临时表或类似的东西。

标签: sql sql-server


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

代码是从记忆中组合的,我面前没有它,所以可能会有一些错字

【讨论】:

    【解决方案2】:

    首先,您需要一个包含要检查的每个日期的表格。您可以为此使用临时表。假设这个表名为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 子句将日期限制为您感兴趣的日期。

    【讨论】:

      【解决方案3】:

      如果您使用的是 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 天来包含当天的结束日期金额

      【讨论】:

        【解决方案4】:

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

        cte 部分生成自年初以来的日期列表(假设),下一部分根据您的数据集计算计数。

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-24
          • 2013-06-05
          • 2013-04-18
          • 2014-09-09
          • 1970-01-01
          相关资源
          最近更新 更多