匹配家庭年龄因素SQL

时间:2011-11-16 02:40:48

标签: sql ms-access ms-access-2007

我想产生以下结果:

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来产生欲望结果。

1 个答案:

答案 0 :(得分: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
  3. 希望这有帮助。