2011-07-07 44 views
1

我有一個具有「週期」,看起來像這樣(添加了一些行爲例)的表:
SQL Server 2008的信息劃分到天

 
      | StartDate | EndDate | Amount1 | Amount2 | Type 
============================================================== 
1   | 20110101 | 20110131 |  89 |  2259 | 1 
2   | 20110201 | 20110228 |  103 |  50202 | 1 
3   | 20110301 | 20110331 |  90 |  98044 | 1 
4   | 20110401 | 20110430 |  78 | 352392 | 1 
============================================================== 


正如你可以看到每個「期間「恰好是一個月。每個月都有四次表示(有四種類型),所以此表有48行。

我有一個選擇,它給了我每個週期的天數(簡單地說,EndDate的一天,因爲它始終是該週期的天數),而Amount1PerDay和Amount2PerDay(該週期的數量除以天數)。

第一個問題是:
我在這個表上顯示我的每一天一行與持有該期間的日,該數除以值Amount1和AMOUNT2列每個時期需要View期。

第二個問題是:
大多數這些部門並沒有給我一個整數。小數不是一個選項,所以我需要在這段時間的頭幾天之內分割剩餘的日子(分割之後)。 以1月爲例:金額1有89.分31天差不多是2,9。所以它每天2,第27天得到3(9 * 31 = 27)。這樣結果只有整數。

回答

1

假設StartDateEndDatedate類型或datetime,並且Amount1 & Amount2是整數:

SELECT 
    Date, 
    Amount1 = Amount1Whole + CASE WHEN DayNum < Amount1Rem THEN 1 ELSE 0 END, 
    Amount2 = Amount2Whole + CASE WHEN DayNum < Amount2Rem THEN 1 ELSE 0 END, 
    Type 
FROM (
    SELECT 
    Date   = DATEADD(day, v.number, t.StartDate), 
    DayNum  = v.number, 
    Amount1Whole = Amount1/DAY(t.EndDate), 
    Amount2Whole = Amount2/DAY(t.EndDate), 
    Amount1Rem = Amount1 % DAY(t.EndDate), 
    Amount2Rem = Amount2 % DAY(t.EndDate), 
    t.Type 
    FROM atable t 
    INNER JOIN master..spt_values v ON v.type = 'P' 
     AND v.number BETWEEN 0 AND DATEDIFF(day, t.StartDate, t.EndDate) 
) s 

SQL Server執行整數除法當兩個操作數是整數,所以,例如,5/2的結果將是2,而不是2.5

master..spt_values是一個長期存在的用於內部目的的系統表。它包含您可以用作number (tally) table的行的子集,這是它在此查詢中的作用。

+0

很好的答案!謝謝! –

1

Q1

如何選擇一個日期範圍的這篇文章中解釋說: http://social.msdn.microsoft.com/forums/en-US/sqlexpress/thread/916161f2-cf3c-4b6b-9015-9d13ed1af49e/

這應該產生一個THEDATE指定列用於Q2

Q2

如何選擇分配的金額如下: SELECT FLOOR(AMOUNT/NUMDAYS)+ IIF(DAY(THEDATE)< =(AMOUNT - NUMDAYS * FLOOR(AMOUNT/NUMDAYS)), 0)

NUMDAYS = DATEDIFF(d,STARTDATE,ENDDATE)+ 1

+0

邏輯基本上沒問題,但SQL Server中沒有'IIF'。 –

+0

謝謝米奇爾。我沒有打算測試這個,因爲即時準備好的答案Andriy給了我完美的工作。不過,我們確實閱讀了你的鏈接,這對我們有很大幫助! –