微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算不同时间段内每个相关记录在db中的行数

如何解决计算不同时间段内每个相关记录在db中的行数

我正在努力寻找这种情况的最佳解决方案。 我必须将彼此相关的表Account和Incident关联为1:N。 我想要一个查询,它可以给出不同时间段内具有打开状态,关闭状态等的事件总数。例如,最近15天开放的门票,最近30天开放的门票。 预期的Ouput示例(未显示所有列):

`+--------------+---------------+---------------+----------------+-----------------+
| TckOpenLast7 | TckOpenLast15 | TckOpenLast30 | TckClosedLast7 | TckClosedLast15 |
+--------------+---------------+---------------+----------------+-----------------+
|        40463 |        50463  |         60463 |        4       |               8 |
+--------------+---------------+---------------+----------------+-----------------+`

所以我在下面尝试了这个简单的查询,并给了我正确的结果,但是我需要一个更优雅,性能更好的查询

Select TckOpenLast7= (Select Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,-7,GETDATE()) And statecode=0 And CustomerId=@Accid),TckOpenLast15=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,-15,GETDATE() )And statecode=0 And CustomerId=@Accid),TckOpenLast30=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,-30,TckClosedLast7=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,GETDATE()) And statecode=1 And CustomerId=@Accid),TckClosedLast15=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,TckClosedLast30=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,TckInProcessLast7=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,TckInProcessLast15=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,TckInProcessLast30=(Select  Count(incidentId) From Incident where CreatedOn >= DATEADD(DAY,GETDATE()) And statecode=1 And CustomerId=@Accid)

我正在使用一个SSIS包,该包使用ADO.Net连接从sql Server数据库中检索数据。

解决方法

使用条件聚合:

select sum(case when CreatedOn >= DATEADD(DAY,-7,GETDATE()) and state = 0
                then 1 else 0
           end) as TckOpenLast7,sum(case when CreatedOn >= DATEADD(DAY,-15,GETDATE()) and state = 0
                then 1 else 0
           end) as TckOpenLast15,. . .
From Incident
where CustomerId = @Accid;

为了提高性能,您希望在(CustomerId)甚至(CustomerId,state,CreatedOn)上建立索引。

也:请注意,GETDATE()具有时间分量。我猜您希望日期没有是时间成分。一种简单的方法是在FROM子句中将其作为单独的“变量”删除:

select sum(case when CreatedOn >= DATEADD(DAY,v.date) and state = 0
                then 1 else 0
           end) as TckOpenLast7,v.date) and state = 0
                then 1 else 0
           end) as TckOpenLast15,. . .
from Incident i cross join
     (values (convert(date,getdate()))) v(date)
where CustomerId = @Accid;
,

您可以使用条件聚合

select
  sum(iif(CreatedOn >= DATEADD(DAY,GETDATE()) And statecode=0,1,0) TckOpenLast7,sum(iif(CreatedOn >= DATEADD(DAY,GETDATE() )And statecode=0,0) TckOpenLast15,-30,0) TckOpenLast30,GETDATE()) And statecode=1,0) TckClosedLast7,0) TckClosedLast15,0) TckClosedLast30,0) TckInProcessLast7,0) TckInProcessLast15,0) TckInProcessLast30
from Incident
where CustomerId=@Accid;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。