2011-11-16 44 views
1

我想產生如下結果:匹配家庭年齡等因素SQL

Table: [0070 Home Age Factor] 
Policy Number: Home Age:  Home Age Factor: 
100    31    1.1 
101    35    1.1 
102    42    1.15 

從以下規則:

Table: [Factor_HomeAge] 
    Home Age:    Factor: 
    New Construction  0.800 
    1 to 5 years old  0.850 
    6 to 10 years old  0.900 
    11 to 15 years old  0.950 
    16 to 20 years old  1.000 
    21 to 30 years old  1.050 
    31 to 40 years old  1.100 
    over 40 years old  1.150 

這是我到目前爲止有:

SELECT HWData.[Policy Number] 
    , (DATEPART("YYYY", HWData.[Effective Date]) - 
     HWData.[Year Built]) AS [Home Age] 
    , Factor_HomeAge.Factor 
FROM [0070 Home Age Factor] 
INNER JOIN Factor_HomeAge ON iif([0070 Home Age Factor].[Home Age] > 41, 41 
    , [0070 Home Age Factor].[Home Age]) = Factor_HomeAge.[Home Age] 
ORDER BY HWData.[Policy Number]; 

但它不會產生我想要的結果,任何人都可以幫忙嗎?我認爲我的內部連接部分不正確。我想用表Factor_HomeAge來產生願望結果。

回答

4

根據您的模型和業務規則的靈活性,有幾種方法可以解決這個問題。

  1. Home_Age應每年從0到100+列出相應的因子值。如果您的業務規則發生變化並且一系列年限的因素必須改變,那麼使用簡單的UPDATE Factor_HomeAge SET Factor = <value> WHERE Home_Age BETWEEN <min> and <max>;將更容易維護。如果您想保留歷史記錄,還可以包含有效期限和過期日期。
  2. 將Home_Age分成兩欄:Floor_AgeCeiling_Age。它不像以前的解決方案那樣靈活,因爲您的給定因子的範圍可能隨着時間的推移而擴大和/或崩潰。這使得維護變得更加困難,尤其是在桌面上沒有生效/過期日期的情況下。您的JOIN會表現得更像是CROSS JOIN,因爲您會J OIN Home and Factor_HomeAge ON Home.Age BETWEEN Factor_HomeAge.Floor_Age and Factor_Home.Ceiling_Age

希望這會有所幫助。

+0

「您的JOIN會表現得更像一個CROSS JOIN」 - 聽起來更像是一個theta(內部)加入我。 – onedaywhen

+0

想通過它多一點它可能會更多的是一個內部聯接。我沒有什麼可以模擬和測試所選擇的確切連接策略的查詢計劃。謝謝。 –