T-SQL编程。公用表表达式

时间:2015-09-23 13:23:01

标签: sql sql-server database

我需要在以下的scneario中提供帮助。我正在使用T-SQL 以下是我的表格详情。假设表名是#tempk

Customer Current_Month Contract Amount
201      2015-09-01     3       100

我的要求是从当月开始增加12个月。即2016-09-01。假设 我得到了这个月的开始日期。我需要以下格式的数据

Customer Renewal_Month Contract_months  End_Month Amount
201      2015-09-01     3           2016-09-01 100
201      2015-12-01     3           2016-09-01 100
201      2015-03-01     3           2016-09-01 100
201      2015-06-01     3           2016-09-01 100

合约列可以包含任何值 后续记录是先前记录中的合同列的增量。 我使用以下查询。我有一个名为Dim_Date的日期维度表,它有日期,quareter,年,月等。

WITH GetProrateCTE (Customer_ID,Renewal_Month,Contract_Months,End_Month,MRR) as
(SELECT Customer_ID,Renewal_Month,Contract_Months,DATEADD(month, 12,Renewal_Month) End_Month,MRR
 from #tempk),
GetRenewalMonths (Customer_ID,Renewal_Month,Contract_Months,End_Month,MRR) as
(
SELECT A.Customer_ID,B.Month Renewal_Month,A.Contract_Months,A.End_Month,A.MRR
FROM GetProrateCTE A
INNER JOIN (SELECT Month from DW..Dim_Date B GROUP BY MONTH) B
ON  B.Month between A.Renewal_Month and A.End_Month
)
SELECT G.Customer_ID,G.Renewal_Month,G.Contract_Months,G.End_Month,G.MRR
FROM GetRenewalMonths G

你能帮助我实现这个结果吗?任何帮助将不胜感激。

我想在Common table Expressions中执行此操作。或者如果我去光标会更好。

1 个答案:

答案 0 :(得分:1)

您可以尝试这种方式 -

WITH CTE AS
(SELECT Customer,DATEADD(MM,DATEDIFF(MM,0,Current_Month), 0) AS Renewal_Month,Contract,DATEADD(YEAR,1,Current_Month) AS End_Month,Amount,1 AS Level FROM #tempk
UNION ALL
SELECT t.Customer,DATEADD(MONTH,t.Contract,c.Renewal_Month),t.Contract,DATEADD(YEAR,1,t.Current_Month) AS End_Month,t.Amount,Level + 1 
FROM #tempk t join CTE c on t.customer = c.customer 
WHERE Level < (12/t.Contract))
SELECT  Customer,Renewal_Month,Contract AS Contract_months,End_Month,Amount 
FROM CTE

只需将日期维度表的逻辑附加到此。

相关问题