2017-08-01 33 views
2

我有一個T-SQL Quotes表,需要能夠計算過去幾個月內處於打開狀態的引用數。T-SQL前幾個月的狀態記錄數

我必須使用的日期是'Add_Date'時間戳和'Update_Date'時間戳。一旦報價被置於該列中值爲'1'的'Won'或'Loss'列中,它就不能再被更新。因此,'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 

預先感謝您的幫助!

+0

的SQL Server的哪個版本? – scsimon

+0

@scsimon,這是一個通過基於Web的ERP客戶端的T-SQL查詢,我相信這是2012年,但不是100%肯定的。 – SDS

回答

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 
+0

你不會錯過任何東西 - 答案很棒,因爲它非常簡單。完善。謝謝。 – SDS

+0

@SDS這是一種解脫。我懷疑你只是在過度思考。我們都有罪。 :) –