创建公用表表达式来转换表

时间:2013-09-27 13:11:37

标签: sql-server-2008 common-table-expression

我似乎对CTE并不是很好并且设置它们。我理解他们,但他们只是在我的技能范围之外,为了我需要的目的创造我自己的技能。我有一个包含以下设计的表

AbsenceID|AbsenceStart|AbsenceEnd|AbsenceType|AbsenceTypeID|StaffCode
222      |01/01/2013  |03/01/2013|FD         |1            |WWF

我已经确定CTE可以根据需要拆分数据,这实际上会产生3条线。每个日期返回一个,例如下面的

AbsenceID|Absencedate|AbsenceType|AbsenceTypeID|StaffCode
222      |01/01/2013 |FD         |1            |WWF
223      |02/01/2013 |FD         |1            |WWF
224      |03/01/2013 |FD         |1            |WWF

2 个答案:

答案 0 :(得分:0)

您不需要CTE。拥有Days表会好得多。如果你有它,那么就这样加入:

select *
from Absences a
join Days d on d.Dat between a.AbsenceStart and a.AbsenceEnd

此外,可以归因天数,属性可以像

一样用于过滤
where d.IsHoliday = 0 

答案 1 :(得分:0)

当datediff(d,AbsenceStart,AbsenceEnd)< 2047

这是SqlFiddle上的演示。

select AbsenceID + number 'AbsenceID', AbsenceType, dateadd(d, v.number, AbsenceStart) 'Absencedate',
AbsenceTypeID, StaffCode
from master..spt_values v, abc a 
where type='p'
and dateadd(d, v.number, AbsenceStart) between AbsenceStart and AbsenceEnd

第二个例子没有任何限制。

这是SqlFiddle上的演示。

with cte
as
(
select AbsenceID, AbsenceID incr,  AbsenceStart, AbsenceEnd, AbsenceType, AbsenceTypeID, StaffCode
from abc

union all

select b.AbsenceID, b.AbsenceID + 1 incr,  DATEADD(D, 1, b.AbsenceStart) AbsenceStart, 
b.AbsenceEnd, a.AbsenceType, a.AbsenceTypeID, a.StaffCode
from abc a inner join cte b on a.AbsenceID = b.AbsenceID
where b.AbsenceStart < a.AbsenceEnd
)

select incr AbsenceID, AbsenceType, AbsenceStart, AbsenceTypeID, StaffCode
from cte
order by 1
option (maxrecursion 0)