2011-11-16 45 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

想通过它多一点它可能会更多的是一个内部联接。我没有什么可以模拟和测试所选择的确切连接策略的查询计划。谢谢。 –