我从我的表中有以下记录称为支付。我喜欢做的是根据开始和结束服务日期,利用仅1列日期将每条记录分成单独的记录集。单独记录分享日期范围利用单列日期
DisbursementID ServiceProviderID Original CircuitID Beginning_Service_Date Ending_Service_Date Amount
-------------- ----------------- -------- ----------- ---------------------- ------------------- -----------
53562 673 0 1814 2015-12-01 2015-12-31 531
53563 673 0 1814 2015-11-01 2015-11-30 531
我的目标结果是看起来像
DisbursementID ServiceProviderID Original CircuitID Date Range Amount
-------------- ----------------- -------- ----------- ---------- -------
53562 673 0 1814 2015-12-01 531
53562 673 0 1814 2015-12-02 531
53562 673 0 1814 2015-12-03 531
53562 673 0 1814 2015-12-04 531
53562 673 0 1814 2015-12-05 531
53563 673 0 1814 2015-11-01 531
53563 673 0 1814 2015-11-02 531
53563 673 0 1814 2015-11-03 531
53563 673 0 1814 2015-11-04 531
53563 673 0 1814 2015-11-05 531
而不是我的结果看起来像
DisbursementID ServiceProviderID Original CircuitID Date Range Amount
-------------- ----------------- -------- ----------- ---------- -------
53562 673 0 1814 2015-12-01 531
53563 673 0 1814 2015-11-01 531
53563 673 0 1814 2015-11-02 531
53563 673 0 1814 2015-11-03 531
53563 673 0 1814 2015-11-04 531
53563 673 0 1814 2015-11-05 531
下面是一段代码,我发现,但适合我的需要。它几乎解决了我的问题,但我不知道如何从我的第一个记录中包含范围日期块。我知道为什么这样做,但不知道如何正确地解决它:
;With Dates as
(
Select DisbursementID, ServiceProviderID,Original,CircuitID
,Beginning_Service_Date as BeginDate, Ending_Service_Date as EndDate
,Amount From Disbursement
Union All
Select DisbursementID, ServiceProviderID, Original,CircuitID
,DATEADD(day,1,BeginDate) as CalenderDate, EndDate
,Amount
From Dates
Where DATEADD(day,1,BeginDate) <= EndDate
)
Select DisbursementID, ServiceProviderID,Original,CircuitID
,BeginDate as [Date Range], Amount from Dates
Order By CircuitID
Option (MAXRECURSION 366);
谢谢。我没有一个TALLY/CALENDAR表,我不知道CROSS APPLY是如何工作的,但现在就看看它。 –
哦,我喜欢你编辑过的另一个选项解决方案。使用SQL代码的我的ETL过程遇到了使用您的第一个解决方案的问题,但是您的EDITED解决方案使其更好。 –
@CharlesBernardes奇怪的是,你有第一个问题。两人都得到了相同的结果。将CROSS APPLY放在你的后袋里。他们很有用...把它们当作一个子程序 –