2011-07-07 45 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给了我完美的工作。不过,我们确实阅读了你的链接,这对我们有很大帮助! –