2016-02-29 24 views
0

我有三个表格,一个跟踪案例,一个跟踪案件关闭时的情况,最后一个是包含一段时间的日期的自定义表格。由于必须填写每一天以及次要日期表中的因素,因此我对于如何为此创建查询有点遗憾。聚合记录在日期维度表上的计数,考虑聚集中的次要日期

tblCase:

  • tblCase.CaseId [唯一标识符]
  • tblCase.CreatedOn [DATETIME]

tblCaseClose:

  • tblCaseClose.CaseId [唯一标识符]
  • tblCaseClose.CreatedOn [DATETIME]

tblDates:

  • tblDates.Date [DATETIME]

对于tblDates每个日期,我想总结的开放病例总数。一个案例被视为从其CreatedOn日期开放,直到创建与案例相关的相应tblCaseClose记录。如果在同一天它被关闭的情况下创建,它将计为0.

任何有关如何处理此问题的建议将不胜感激!

+1

'tblCaseClose.CreatedOn'代表什么值?案件开庭日期或案件结案日期?对于任何问题,样本表数据,预期结果以及您迄今为止所获得的任何查询(即使它不工作)总是首选。 –

+0

tblCaseClose.CreatedOn是案件结案的日期。为了这个问题,我简化了表格结构。我没有分享这个问题,因为我根本无法解决问题,担心它可能会混淆这个问题而不是解释它。 – fb88

回答

0

这里是一个低效率的方法,但它应该工作正常在较小的数据:

select d.*, 
     ((select count(*) from tblCase c where c.CreatedOn <= d.date) - 
     (select count(*) from tblCaseClose cc where cc.CreatedOn <= d.date) 
     ) as NumOpenCases 
from tblDates d; 

换句话说,开放的情况下,在给定日期的数字是已经打开了案件总数到那个日期减去已经结束的数字。

不幸的是,SQL Server 2008不支持累计和。使用该功能的SQL Server 2012+中有更高效的方法。

0

我最终得到了一个解决方案,我想我不知道它有多优雅。它确实使用了减去开放式案例减去结案案例的想法,但它确保了通用案例式闭包不会影响计数,只有在结果集中包含的案例才会关闭。

DECLARE 
@StartDate DATE = DATEADD(DAY, -5, GETDATE()) , 
@EndDate DATE = GETDATE() 
SELECT 
    tt.Date , 
    (SUM(tt.[Case Open]) - SUM(tt.[Case Closed])) [Open Cases] 
FROM 
    (
     SELECT 
     dateTbl.[Date] , 
     CASE WHEN ISNULL(fi.createdon, 0) = 0 THEN 0 
      ELSE 1 
     END [Case Open] , 
     CASE WHEN ISNULL(fir.createdon, 0) != 0 
        AND dateTbl.[Date] >= CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, fir.createdon))) THEN 1 
      ELSE 0 
     END [Case Closed] 
     FROM 
     (
      SELECT 
      DATEADD(DAY, Nbr - 1, @StartDate) [Date] 
      FROM 
      (
       SELECT ROW_NUMBER() OVER (ORDER BY c.object_id) AS Nbr FROM sys.columns c 
      ) nbrs 
      WHERE 
      Nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
     ) dateTbl 
     LEFT JOIN dbo.FilteredIncident AS fi ON CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, fi.createdon))) <= dateTbl.[Date] 
               AND fi.createdon >= @StartDate 
     LEFT JOIN dbo.FilteredIncidentResolution AS fir ON fir.incidentid = fi.incidentid 
    ) tt 
GROUP BY 
    tt.[Date] 
ORDER BY 
    tt.[Date]