Sql server 计算连续12个月内的患病时间和持续时间

Sql server 计算连续12个月内的患病时间和持续时间,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我对SQL相当陌生,发现这个网站是一个非常棒的资源。我希望在分配给我的任务上能得到一点帮助 基本上,我需要找出一名员工在过去12个月内患病的次数以及每次患病的持续时间 我有一个简单的表,如下所示: Agent Date Status A 01/07/2015 SHIFT A 02/07/2015 SHIFT A 03/07/2015 SICK A 04/07/2015 SHIFT A 05/07/2015 SHIFT A 06/07/2

我对SQL相当陌生,发现这个网站是一个非常棒的资源。我希望在分配给我的任务上能得到一点帮助

基本上,我需要找出一名员工在过去12个月内患病的次数以及每次患病的持续时间

我有一个简单的表,如下所示:

Agent Date       Status
A     01/07/2015 SHIFT
A     02/07/2015 SHIFT
A     03/07/2015 SICK
A     04/07/2015 SHIFT
A     05/07/2015 SHIFT
A     06/07/2015 SHIFT
B     01/07/2015 SICK
B     02/07/2015 SICK
B     03/07/2015 SHIFT
B     04/07/2015 SHIFT
B     05/07/2015 SICK
B     06/07/2015 SICK
C     01/07/2015 SHIFT
C     02/07/2015 SHIFT
C     03/07/2015 SICK
C     04/07/2015 SICK
C     05/07/2015 SICK
C     06/07/2015 SHIFT
我希望有人能帮我找到一些能产生以下输出的代码:

Agent   Days
A       1
B       2
B       2
C       3
任何帮助都将不胜感激

为sql server干杯:

select count(1) from TableA
  where Status = 'SICK' and Date >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE)
  group by Agent
按病期分组:

WITH Cte AS(
    SELECT *,
        DATEDIFF(dd, '12/30/1899', [Date]) as [number],
        RN = DATEDIFF(dd, '12/30/1899', [Date]) - ROW_NUMBER()
     OVER(PARTITION BY Agent ORDER BY DATEDIFF(dd, '12/30/1899', [Date]))
    FROM TableA 
     WHERE  
        [Status] = 'SICK' and 
        [Date] >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE)
)
,CteFinal AS(
    SELECT
        Agent,
    startNumber = MIN(number),
    endNumber = MAX(number)
FROM Cte
GROUP BY Agent, RN
)

select Agent, endNumber - startNumber +1 as [Days] from CteFinal
group by agent, startNumber, endNumber

此外,对于表B中有休息日的情况:

WITH Cte AS(
    SELECT distinct *,
        DATEDIFF(dd, '12/30/1899', [Date]) as [number],
        RN = DATEDIFF(dd, '12/30/1899', [Date]) - ROW_NUMBER()
     OVER(PARTITION BY Agent ORDER BY DATEDIFF(dd, '12/30/1899', [Date]))
    FROM (select distinct * from TableA 
        union all 
        select distinct Agent, b.Date, 'DAY OFF' from TableA cross join TableB b) TableA 
     WHERE  
        [Status] IN ('SICK', 'DAY OFF') and 
        [Date] >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE)
)
,CteFinal AS(
    SELECT
        Agent,
    startNumber = MIN(number),
    endNumber = MAX(number),
    dayOffs = SUM(CASE WHEN [Status] = 'DAY OFF' THEN 1 ELSE 0 END)
FROM Cte
GROUP BY Agent, RN
)

select Agent, endNumber - startNumber +1 - sum(dayOffs) as [Days] from CteFinal
group by agent, startNumber, endNumber
having(endNumber - startNumber +1 - sum(dayOffs) > 0)

谢谢Stepan,这给了我一位经纪人一天的病假,但不是单独的时间。预期输出应该列出代理B两次,并显示两个周期为2天。明白了。添加了另一个版本以满足您对ms sql server的所有要求。请尝试一下到达那里:-)但不完全是。现在,输出将代理B列为4个单独的病假期间的4倍。由于在两个实际的生病期间之间有一个转变,我正在寻找一些能够认识到这一点并分别统计它们的东西。因此,代理B将被列出两次,每次都有2天的病假。第二次查询(我在CTE中建议的)返回的正是您所需要的内容—代理的每个病假期间的单独记录以及每个期间的病假天数计数。您可以在这里的sqlfiddle中检查它以确保这一点——正如您所看到的,结果与预期的输出相同。请更具体地描述一下,在第二次查询的结果中,有什么不适合您。对不起,Stepan,这正是我想要的。奇怪的是,当我用虚拟数据创建并填充#Temp表时,我使用了多个#Temp(代理、日期、状态)值('a'、'06/05/15'、'Shift'),它会输出不同的结果。非常感谢你的帮助。