【问题标题】:creating a common table expression to transform a table创建公用表表达式来转换表
【发布时间】:2013-09-27 13:11:36
【问题描述】:

我似乎不太擅长 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

【问题讨论】:

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


【解决方案1】:

您不需要 CTE。最好有一张 Days 表。如果你有,那么就这样加入吧:

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

也可以归因于天,并且可以像这样使用属性进行过滤

where d.IsHoliday = 0 

【讨论】:

    【解决方案2】:

    当 datediff(d, AbsenceStart, AbsenceEnd)

    这是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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多