上个月的SQL Carryover

时间:2018-05-07 15:22:38

标签: sql sql-server

我有一些数据,我试图得到一些重视。输入记录的时间和关闭记录的日期(如果已关闭)。我希望能够计算出从本月的第一个月开始的上个月仍有多少记录。这是一个例子。第一个表是数据,第二个表是我要查找的结果。在第二个表中,忽略括号,它们只是构成该计数的记录的ID。

Position    DateEntered   DateClosed
    1        12/15/2017   12/20/2017
    11       12/20/2017    1/7/2018
    2        1/23/2018     2/3/2018
    3        1/24/2018  
    4        2/15/2018  
    5        2/20/2018     5/16/2018
    6        3/3/2018      3/15/2018
    7        3/23/2018     4/12/2018
    8        4/11/2018     5/10/2018
    9        4/12/2018     4/25/2018
    10       5/4/2018   

Year    Month      Carried Over
2018    January        1 (11)
2018    February       2 (2,3)
2018    March          3 (3,4,5)
2018    April          4 (3,4,5,7)
2018    May            4 (3,4,5,8)
2018    June           3 (3,4,10)
2018    July           3 (3,4,10)
2018    August         3 (3,4,10)

这可能,如果可行,怎么样?几个小时之后,我一直在脑子里绞尽脑汁。

1 个答案:

答案 0 :(得分:3)

对于每个月,您需要在该月之前和之后开始的行数。我在想:

with dates as (
      select cast('2018-01-01' as date) as dte
      union all
      select dateadd(month, 1, dte)
      from dates
      where dte < '2018-08-01'
    )
select d.dte,
       (select count(*)
        from t
        where t.dateentered < d.dte and
              (t.dateclosed > d.dte or t.dateClosed is null)
       ) as carriedover
from dates d;

请注意,这会将日期放在一列中,而不是将年份和月份拆分为单独的列。这很容易安排,但我更喜欢将日期组件保持在一起。