我有下一个情况(SQL SERVER 2012):
这是我的源表(日期是dd-mm-yyyy):
id|startDate |updateDate |percentage
--|------------|------------|----------
01| 01-01-2015| 03-01-2015| 45
01| 01-01-2015| 05-01-2015| 80
01| 01-01-2015| 06-01-2015| 100
我想最终得到以下表格:
id|date |percentage
--|------------|----------
01| 01-01-2015| 0
01| 02-01-2015| 0
01| 03-01-2015| 45
01| 04-01-2015| 45
01| 05-01-2015| 80
01| 06-01-2015| 100
我的计划是使用日期表进行连接,但我主要关注的是如何生成百分比为0的记录,因为源只有一个startdate和第一个更新。
所以我看到它,首先我需要在startDate和第一个updateDate之间做一个日期,从当前updateDate和之前的updateDate之间有一个日期。这就是我担心的问题,我怎样才能做到这一点?
提前感谢!
PS。日期表只是一个包含每个日期的简单表格
id|date |month |etc...
--|------------|------|-------
01| 01-01-2015| 1 |
01| 02-01-2015| 1 |
01| 03-01-2015| 1 |
01| 04-01-2015| 1 |
01| 05-01-2015| 1 |
01| 06-01-2015| 1 |
etc...
答案 0 :(得分:1)
一种方法(使用递归CTE):
; with cte as
(select '01' id, cast('2015-01-01' as datetime) [date], 0 percentage
union all
select c.id,
dateadd(DAY,1,c.[date]) [date],
coalesce((select s.percentage
from SourceTable s
where c.id = s.id and dateadd(DAY,1,c.[date]) = s.updatedate),
c.percentage) percentage
from cte c
where c.[date] < '2015-01-06')
select * from cte
SQLFiddle here。
答案 1 :(得分:0)
首先将您的日期帮助表与updateDate上的源表联系起来。 然后,我将子查询关联起来,以获得任何小于我们当前加入日期的日期的最大百分比。
With tblDates AS (
select *
from Dates d
left join Table1 t on CAST(d.date as date) = t.updateDate
)
select d.id,
d.[date],
(select ISNULL(max(percentage), 0)
from tblDates d1
where d1.[date] < d.[date]) as percentage
from tblDates d