Sql 用日期复制行

Sql 用日期复制行,sql,sql-server-2008,Sql,Sql Server 2008,我试图建立一个表,每个半月薪期一行,多个项目的数百名员工的半月薪金额。我从ERP系统收到的行数据格式如下: 名称、项目、担保金额所有期间的工资总额、calcbegindate、calenddate 我想建立一个表,它将复制每行n乘以n,n是calcbegin和calcend之间的半个月发薪期数 我的问题是如何在范围之间生成半个月的日期,然后使用mssql 2008生成包含每个日期和相关信息的行 这是一个数据示例。我认为CTE是一条路要走,但我不知道如何让它工作。如果我能让CTE工作的话,我可以修

我试图建立一个表,每个半月薪期一行,多个项目的数百名员工的半月薪金额。我从ERP系统收到的行数据格式如下:

名称、项目、担保金额所有期间的工资总额、calcbegindate、calenddate

我想建立一个表,它将复制每行n乘以n,n是calcbegin和calcend之间的半个月发薪期数

我的问题是如何在范围之间生成半个月的日期,然后使用mssql 2008生成包含每个日期和相关信息的行

这是一个数据示例。我认为CTE是一条路要走,但我不知道如何让它工作。如果我能让CTE工作的话,我可以修改日期

Existing Data                   
Name    Amount   Per amt    calcbegin   calcend Pay Periods
Name1   5000     2,500  4/15/2013   5/15/2013   2
Name2   10000    2,000  4/15/2013   6/30/2013   5

Results Requested                   
Name    Amount   Pay amt    calcbegin   calcend Payperiods
1-Name1 5000     2,500  04/15/13    4/30/2013   1
2-Name1 5000     2,500  05/01/13    5/15/2013   1

1-Name2 10000    2,000  04/15/13    4/30/2013   1
2-Name2 10000    2,000  05/01/13    5/15/2013   1
3-Name2 10000    2,000  05/16/13    5/31/2013   1
4-Name2 10000    2,000  06/01/13    6/15/2013   1
5-Name2 10000    2,000  06/16/13    6/30/2013   1

非常感谢Justin Stolle,SQL:将日期范围转换为Google找到的日期列表。通过扩展他的示例,我能够构建一个功能正常的递归CTE。现在来调整日期

WITH cte (id, b, a_p, n,e ,pp, a, ae) AS 
          (SELECT        Range_ID as id
                        ,DATEADD(wk, 2,[calc begin]) AS B
                        ,[Activity/Project] AS a_p 
                        ,Name as n
                        ,[Calc End] as E
                        ,DATEDIFF(w,[calc begin],[Calc End])/14 as pp
                        ,([Salary Encumbrance] + [Benefits Encumbrance])/(DATEDIFF(w,[calc begin],[Calc End])/14) as a
                        ,[Account Executive] as ae
               FROM EncumReport
           WHERE [Account Executive] like '%25%' 

           UNION ALL
           SELECT    Range_Id as id
                    ,(DATEADD(wk, 2, cte.b)) AS b
                    ,[activity/project] as a_p 
                    ,Name as n
                    ,[Calc End] as E
                    ,DATEDIFF(w,[calc begin],[Calc End])/14 as pp
                    ,([Salary Encumbrance] + [Benefits Encumbrance])/(DATEDIFF(w,[calc begin],[Calc End])/14) as a
                    ,[Account Executive] as ae
               FROM cte
               INNER JOIN encumreport
                      ON cte.id = range_id
                WHERE cte.b < [calc end]-7)

     SELECT id AS range_id  
           ,b AS date_within_range,a_p as Projects,  n as Name,e as EndDate, pp as PayPeriods, a as Amounts,ae as AccountExecutive  
      FROM cte
     ORDER BY id, b

以日期为主键的数据库表在这里很方便。除了支付期间,您还可以存储财务信息、假期和其他您认为相关的字段。示例数据和所需输出将非常有用。我不完全确定我是否理解你的问题。听起来你想要的是一种日期维度。查看此链接,它建议您使用作为SQL Server数据工具一部分的维度向导。同意@sgedes。如果您为calcbegin和calcend提供一些示例值,以及在每种情况下希望得到的结果行,那么人们可能会理解您的问题。文字问题和故事很有趣,但解决方案需要真实的数据。听起来你们需要一个CTE来生成一个包含适当日期的表格。日期计算可能会变得相当复杂,这取决于您如何计算周末的付款日期,计息日和日历日期是否总是在付款日期。可以使用数字表上的联接代替CTE。