T-SQL上个月状态记录的计数

时间:2017-08-01 13:53:53

标签: sql-server tsql date count

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

我必须使用的日期是'Add_Date'时间戳和'Update_Date'时间戳。将报价放入该列中值为“1”的“赢”或“损失”列后,将无法再更新报价。因此,'Update_Date'实际上成为Closed_Status时间戳。

以下是一些示例记录:

Quote_No   Add_Date   Update_Date  Open_Quote  Win  Loss
001        01-01-2016  NULL         1           0    0
002        01-01-2016  3-1-2016     0           1    0
003        01-01-2016  4-1-2016     0           0    1

以下是此处所有数据的链接: https://drive.google.com/open?id=0B4xdnV0LFZI1T3IxQ2ZKRDhNd1k

I asked this question previously this year并且一直在使用以下代码:

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;

问题是此代码返回累计值。所以1月份还不错,但是2月真的是1月+ 2月,3月是1月+ 2月+ 3月等等。我花了一段时间才发现这个,现在返回的数字,离开我想要纠正它们。

从完整数据集中,此代码的结果为:

Year-Month  Open_Quote_Count
2017-01      153
2017-02      265
2017-03      375
2017-04      446
2017-05      496
2017-06      560
2017-07      609

期望的结果是在特定月份期间有多少报价处于未结状态,而不是累计:

Year-Month  Open_Quote_Count
2017-01     153
2017-02     112
2017-03     110
2017-04     71

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

除非我遗漏了某些东西,否则LAG()将非常适合

示例

Declare @YourTable Table ([Year-Month] varchar(50),[Open_Quote_Count] int)
Insert Into @YourTable Values 
 ('2017-01',153)
,('2017-02',265)
,('2017-03',375)
,('2017-04',446)
,('2017-05',496)
,('2017-06',560)
,('2017-07',609)

Select *
      ,NewValue = [Open_Quote_Count] - lag([Open_Quote_Count],1,0) over (Order by [Year-Month]) 
 From @YourTable   --<< Replace with your initial query

<强>返回

Year-Month  Open_Quote_Count    NewValue
2017-01     153                 153
2017-02     265                 112
2017-03     375                 110
2017-04     446                 71
2017-05     496                 50
2017-06     560                 64
2017-07     609                 49