如何在时间戳之间的状态中选择记录?T-SQL

Pyt*_*_DK 2 sql t-sql sql-server datetime

我有一个T-SQL报价表,需要能够计算过去几个月中有多少报价处于未结状态.

我必须使用的日期是' Add_Date'时间戳和' Update_Date'时间戳.一旦引用被放入' Closed_Status'of' 1',它就不能再被更新了.因此,' Update_Date'实际上成为Closed_Status时间戳.

我被困了,因为我无法弄清楚如何选择在特定月份打开的所有公开引号.

这是一些示例记录:

Quote_No   Add_Date   Update_Date  Open_Status  Closed_Status
001        01-01-2016  NULL         1            0
002        01-01-2016  3-1-2016     0            1
003        01-01-2016  4-1-2016     0            1
Run Code Online (Sandbox Code Playgroud)

期望的结果是:

Year  Month  Open_Quote_Count
2016  01     3
2016  02     3
2016  03     2
2016  04     1
Run Code Online (Sandbox Code Playgroud)

我已经在这个问题上打了一个精神墙,我试图做一些case when过滤,但我似乎无法想象出这个难题.理想情况下,我不会在日期中进行硬编码,因为这需要多年时间,而且我不希望在编写之后保持这一点.

预先感谢您的帮助.

Gor*_*off 6

你这个月是这样做的.因此,我想到了三种选择:

  • 使用所有月份的列表left join.
  • 递归CTE.
  • 数字表.

让我展示一下:

with n as (
      select row_number() over (order by (select null)) - 1 as n
      from master..spt_values
     )
select format(dateadd(month, n.n, q.add_date), 'yyyy-MM') as yyyymm,
       count(*) as Open_Quote_Count
from quotes q join
     n
     on (closed_status = 1 and dateadd(month, n.n, q.add_date) <= q.update_date) or
        (closed_status = 0 and dateadd(month, n.n, q.add_date) <= getdate()) 
group by format(dateadd(month, n.n, q.add_date), 'yyyy-MM')
order by yyyymm;
Run Code Online (Sandbox Code Playgroud)

这确实假设每个月至少有一个开放记录.这似乎是合理的.