2015-09-25 73 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