[英]Stored Procedure for date ranges in a single column
在我的項目中尋找問題的解決方案
我有與合同相關的階段。 也就是說,合同可以處於Active
階段, Process
階段或Terminated
階段。
我需要在每個階段都沒有合同的日子。
例如,如果一個合同C1
是在Active
階段從20/10/2013
到22/10/2013
,然后在Process
階段從22/10/2013
到25/10/2013
最后在Terminated
從階段25/10/2013
到26/10/2013
,然后在Active
從26/10/2013
到28/10/2013
,那么我應該得到結果
我的表是使用以下列創建的:
EntryId
(主鍵) StageId
( Stage
表的外鍵) ContractId
( contract
表的外鍵) DateofStageChange
如何在SQL Server中執行此操作?
根據要求找到表條目:
EntryID | 階段ID | 合約編號| 日期變更
1 | A1 | C1 | 20/10/2013
2 | P1 | C1 | 22/10/2013
3 | T1 | C1 | 25/10/2013
4 | A1 | C1 | 26/10/2013
5 | P1 | C1 | 28/10/2013
6 | T1 | C1 |空(當前處於此階段)
需要在Stage ID上使用分組依據
檢查並確保表中數據的填充方式非常重要。僅基於示例數據,還請注意,如果entryid不在序列中,則可以使用row_number創建一個序列。
declare @t table(EntryId int identity(1,1), StageId int,ContractId varchar(10),DateofStageChange date)
insert into @t values
(1,'C1','2013-10-20'),(1,'C1','2013-10-22'),(2,'C1','2013-10-22'),(2,'C1','2013-10-25')
,(3,'C1','2013-10-25'),(3,'C1','2013-10-26'),(1,'C1','2013-10-26'),(1,'C1','2013-10-28')
Select StageId,sum([noOfDays]) [totalNofDays] from
(select a.StageId,a.ContractId,a.DateofStageChange [Fromdate],b.DateofStageChange [ToDate]
,datediff(day,a.DateofStageChange,b.DateofStageChange) [noOfDays]
from @t a
inner join @t b on a.StageId=b.StageId and b.EntryId-a.EntryId=1)t4
group by StageId
您無法使用當前的結構。
您可以通過執行datediff(d, getdate(), DateOfStageChange)
獲得最新datediff(d, getdate(), DateOfStageChange)
但您沒有任何歷史記錄,因此無法獲得以前的狀態
可以使用CTE在SQL中完成。
您沒有提供表名,因此您需要更改我在下面指出的位置,但是它看起來像這樣:
;WITH cte
AS (
SELECT
DateofStageChange, StageID, ContractID,
ROW_NUMBER() OVER (ORDER BY ContractID, StageId, DateofStageChange) AS RowNum
FROM
DateOfStageChangeTable //<==== Change this table name
)
SELECT
a.ContractId,
a.StageId,
Coalesce(sum(DATEDIFF(d ,b.DateofStageChange,a.DateofStageChange)), 'CurrentState`) as Days
FROM
cte AS A
LEFT OUTER JOIN
cte AS B
ON A.RowNum = B.RowNum + 1 and a.StageId = b.StageId and a.ContractId = b.ContractId
group by a.StageId, a.ContractId
這實際上只是一個自我聯接,可以在表上創建行號,並按StageID和日期對表進行排序,然后聯接到自身。 階段ID和日期的第一行上的第一個日期與第二行上的第二個日期合並,然后以天為單位計算日期范圍。
假設每個階段只有2個日期,如果有多個日期,則只需要在cte表上進行最小和最大即可。
編輯:
根據您的樣本數據,上述查詢應該可以正常工作。 如果您遇到語法錯誤,請告訴我,我們將對其進行修復。
我添加了一個合並以指示它們當前所處的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.