2015-09-25 81 views
0

我有一个涉及计算6个月期间收入的查询。难点在于开始和结束日期可能是一个月中的任何一天。例如,我可能有一个表是这样的:SQL Server简化涉及重复日期计算的长查询

MyTable 
Year Month Income  
2011  01  38.9 
2011  02  30.5 
2011  03  55.2 
2011  04  28.3 
2011  05  33.6 
2011  06  36.3 
2011  07  41.8 
2011  08  43.7 
... 

比方说,我知道起始日期是2011-02-09。然后结束日期为2011-08-09 6个月。为计算此期间的收入,我必须在2011年2月和8月分别使用开始日期和结束日期分摊这些数字。这使得我的查询看起来像这样:

​​

请注意,我从另一个表中获取具有连接的起始日期。

在我的实际问题中,我有更多的分支比这个例子显示。正如你所看到的,它会变得非常冗长和麻烦。所以我的问题是,SQL中有没有一种方法可以简化这种代码以使其可读性以避免潜在的错误?

我做过关于用户定义函数的研究,但无法想出简单而干净的方法来简化它。

+0

您是否有另一张表格包含按天收入,而不是按月汇总的表格? –

+0

@Tab Alleman,不,这就是为什么我要分配。 – breezymri

回答

0

为什么不建一个表做所有按比例分配的CTE:

WITH Proration AS 
(
Table would look like 
#|NumOfDays|Proration Amount| 
#|1| 0.42| 
#|2| 0.84| 
# etc.... 
) 

然后只是做了计算,并与天

数量的CTE JOIN如果计算仍然变得复杂即使在将逻辑构建到CTE或#Temp表中之后。将它推入另一个临时表并不断将问题分解为更小的问题。

希望这是有道理的。我甚至没有经过你的逻辑转换,只是总的来说,更好的方法可能是解决这个问题。

祝你好运!

+0

是的,这可以工作 - 在范围内为每个月和每年制作一个月份年份表格,然后制定一个0 - 1.0百分比的专业比率列。然后加入到这张表中,然后乘以这个列。如果它是1没有专业评级 - 百分之一,那么你得到的价值。 – Hogan