Sql 了解历史上每天开放的门票数量
我有一张看起来像下图的桌子Sql 了解历史上每天开放的门票数量,sql,sql-server,Sql,Sql Server,我有一张看起来像下图的桌子 ID | CreatedDate | CloseDate 271 | 01-Jan-2018 | 02-Jan-2018 278 | 03-Jan-2018 | 05-Jan-2018 333 | 03-Jan-2018 | NULL 我的任务是找出一个月内每天有多少张票一直开到第二天。如果CloseDate与创建日期不在同一日期,或者CloseDate为空,则票据将被归类为保持打开状态 我从上面得到的理想输出如下所示
ID | CreatedDate | CloseDate
271 | 01-Jan-2018 | 02-Jan-2018
278 | 03-Jan-2018 | 05-Jan-2018
333 | 03-Jan-2018 | NULL
我的任务是找出一个月内每天有多少张票一直开到第二天。如果CloseDate与创建日期不在同一日期,或者CloseDate为空,则票据将被归类为保持打开状态
我从上面得到的理想输出如下所示
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..如果手头没有数字/理货表,可以使用递归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;
有人问你:“我的任务是在一个月内的每一天找出真相。”;我们还没去过。你试过什么,为什么不奏效?请不要要求我们为你做工作。老实说,我不知道从哪里开始。我尝试了一个案例陈述,但我就是不知道该怎么办。我不指望我能完成全部的工作,只是一些方向,因为我还在学习……至少让我们看看那次尝试吧。您在上面提出的唯一问题是“这有意义吗?”这不是一个编程问题。请向我们提供您的SQL存在的问题,并解释为什么它没有在您的SQL之后提供结果。第一步是生成1月到1月之间的所有日期。然后,与您得到的表形成一个左连接,然后统计第一个块的日期在表打开和关闭日期边界内匹配的记录
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;