2013-04-22 31 views
0

我正在嘗試爲每個半月支付期間和每個半數個僱員在多個項目上的半月工資總額建立一行表。我從ERP系統接收該行的數據格式如下:用日期複製行

名稱,項目,擔保金額(總所有期間的工資),calcbegin(日期),calend(日期)

我想建立一個表格,每行重複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 
+0

以日期爲主鍵的數據庫表將在這裏派上用場。除了支付期限之外,您還可以存儲您認爲相關的財務信息,假期和其他字段。 – 2013-04-22 23:01:08

+2

樣本數據和期望的輸出將會很有幫助。不完全確定我理解你的問題。 – sgeddes 2013-04-22 23:05:15

+0

聽起來像你想要的是一種日期維度。看看這個鏈接http://msdn.microsoft.com/en-us/library/ms174832.aspx,它建議你使用'Dimension Wizard',它是SQL Server數據工具的一部分。 – Scotch 2013-04-22 23:06:18

回答

0

非常感謝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