我有一个包含“句点”的表,看起来像这样(添加了一些行作为示例):
| 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 ==============================================================
正如你所看到的,每个“时期”恰好是一个月。每个月代表四次(有4种类型),所以这个表有48行
我有一个选项,它给出了每个时期的天数(简单地说,是EndDate的一天,因为它总是那个时期的天数)和Amount1PerDay和Amount2PerDay(那个时期的数量除以天数) )。
第一个问题是:
我需要在此表格上显示View
,其中显示每个时段中每天的一行,其中Amount1和Amount2列保存该时段的值除以该时段内的天数。
第二个问题是:
大多数这些部门都没有给我一个整数。小数不是一个选项,所以我需要将剩余天数(除法后)除以该期间的前几天。
以1月份为例:Amount1有89个。超过31天,几乎是2,9。因此每天2次,前27天获得3次(,9 * 31 = 27次)。这样结果只有整数。
答案 0 :(得分:1)
本文介绍了如何选择日期范围: http://social.msdn.microsoft.com/forums/en-US/sqlexpress/thread/916161f2-cf3c-4b6b-9015-9d13ed1af49e/
这应该产生一个名为THEDATE的列用于Q2
如何选择分配金额如下: SELECT FLOOR(AMOUNT / NUMDAYS)+ IIF(DAY(THEDATE)< =(AMOUNT - NUMDAYS * FLOOR(AMOUNT / NUMDAYS)),1,0)
NUMDAYS = DATEDIFF(d,STARTDATE,ENDDATE)+ 1
答案 1 :(得分:1)
假设StartDate
和EndDate
属于date
或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的行子集,这是在此查询中使用的行。