涉及res的复杂查询

时间:2014-11-24 17:41:16

标签: sql sql-server tsql

我有如下表格,我需要查询当天创建的任务数量以及已解决的数量,我需要捕获从前一天传递的具有活动状态的任务。例如:TaskId 101创建于2014年10月11日,并在2014年12月11日得到解决,因此它也应该显示在11/11/2014和2014年12月11日的计数中。

TaskId CreateDate Status ResolvedDate
101 11/10/2014 Resolved 11/12/2014
102 11/10/2014 Resolved 11/10/2014
103 11/11/2014 Active NULL 
104 11/11/2014 Resolved 11/13/2014
105 11/13/2014 Active 11/13/2014

请帮助我,因为我无法想到任何解决方案。对不起,我试图以表格格式发布表格架构,但无法创建表格,我是这个论坛的新手。

2 个答案:

答案 0 :(得分:0)

您可以使用case based aggregation

获取结果

CTE生成给定范围的日期列表。

对于每一天,使用casemaxgroup by

计算总活跃(当天创建并先前创建但未解决)和当天解决的总数
declare @start_date datetime = '2014-11-10'
declare @end_date datetime ='2014-11-13'


;WITH CTE AS
(
    SELECT @start_date AS date
    UNION ALL
    SELECT DATEADD(day, 1, date) as date
    FROM CTE
    WHERE DATEADD(day, 1, date) <= @end_date
)
select cte.date,
       sum( case when  createDate <= cte.date and ( resolveddate is null or  ResolvedDate >= cte.date) then 1 else 0 end
          ) as TotalActive,

       sum( case when cte.date = ResolvedDate then 1 else 0 end
          ) as TotalResolved
from cte
left join Table1 T
ON T.createDate <= cte.date
GROUP BY CTE.DATE

答案 1 :(得分:0)

@radar,您刚刚给了我查询的希望,我已经更改了下面的查询,它开始显示结果。但TotalActive显示的价值低于TotalCreated。

declare @start_date datetime = getdate()-30
declare @end_date datetime = getdate()
;WITH CTE AS
(
    SELECT @start_date AS date
    UNION ALL
    SELECT DATEADD(day, 1, date) as date
    FROM CTE
    WHERE DATEADD(day, 1, date) <= @end_date
)
select cte.date,
        sum( case when CONVERT(varchar, CreateDate, 101) <= CONVERT(varchar, cte.date, 101) and CONVERT(varchar, cte.date, 101) <= CONVERT(varchar, ResolveDate, 101) then 1 else 0 end
          ) as TotalActive,
          sum( case when  CONVERT(varchar, cte.date, 101) = CONVERT(varchar, CreateDate, 101) then 1 else 0 end
          ) as TotalCreated,
       sum( case when CONVERT(varchar, cte.date, 101) = CONVERT(varchar, ResolveDate, 101) then 1 else 0 end
          ) as TotalResolved

from cte
left join [WarehouseIncidents] T
ON CONVERT(varchar, CreateDate, 101) >= CONVERT(varchar, cte.date, 101)

GROUP BY CTE.DATE