【问题标题】:Find out how many tickets were open each day historically了解历史上每天开放的门票数量
【发布时间】:2020-02-05 00:51:55
【问题描述】:

我有一张如下所示的表格

 ID   | CreatedDate   |  CloseDate
271   | 01-Jan-2018   |  02-Jan-2018
278   | 03-Jan-2018   |  05-Jan-2018
333   | 03-Jan-2018   |     NULL

我的任务是找出一个月中的每一天,到第二天还有多少张票仍然开放。如果 CloseDate 与创建日期不在同一日期,或者 CloseDate 为 NULL,则工单将被归类为保持打开状态。

我的理想输出应该是这样的

Day          | Tickets Remaining
01-Jan-2018  |        1
02-Jan-2018  |        0
03-Jan-2018  |        2
04-Jan-2018  |        2
05-Jan-2018  |        1

这有意义吗?使用 SQL Server 2016..

【问题讨论】:

  • "的任务是找出一个月中的每一天" 已被询问;我们没有。 尝试了什么,为什么没有成功?请不要要求我们为您完成工作。
  • 老实说,我不知道从哪里开始。我尝试了一个案例陈述,但我无法理解如何处理它。我不指望为我完成全部工作,只是一些我仍在学习的方向..
  • 至少让我们看看那个尝试。您在上面问的唯一问题是 “这有意义吗?” 这不是编程问题。向我们提供您在使用 SQL 时遇到的问题,并解释为什么它没有在您之后给出结果。
  • 第一步是生成一月之间的所有日期。然后对你得到的表进行左连接,然后计算第一个块的日期在表打开和关闭日期的边界内匹配的记录

标签: sql sql-server


【解决方案1】:

如果您手边没有数字/计数表,您可以使用递归 CTE:

with cte as (
      select id, createddate as dte, coalesce(closeddate, convert(date, getdate())) as closeddate
      from t
      union all
      select id, dateadd(day, 1, dte), closeddate
      from cte
      where dte < closeddate
     )
select dte, count(*)
from cte
group by dte;

注意:如果任何时间跨度可以超过 100 天,则需要添加 option (maxrecursion 0)

如果只有少数日期,您可以使用派生表和left join

select v.dte, count(t.id)
from (values (convert(date, '2018-01-01')),
             (convert(date, '2018-01-02')),
             (convert(date, '2018-01-03')),
             (convert(date, '2018-01-04')),
             (convert(date, '2018-01-05')),
     ) v(dte) left join
     t
     on v.dte >= t.createddate and
        (v.dte <= t.closeddate or t.closeddate is null)
group by v.dte
order by v.dte;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2023-03-10
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多