我们如何连接通过SQL中的“ where”语句过滤的多个结果

有两个表,如下所示:

财务:

policy_id   state   coverage    earned_premium_dollar_amount    
1            OH       bi          1.7   
1            OH      umuim        0.82  
2            OH      coll         13.34 
3            TX      coll         13.28
6            TX      comp         6.55
`
`
`

地区:

state   bi     pd    comp   coll
TX     1.01   1.12   0.82   0.93
TX     1.88   1.39   2.63   1.32
OH     1.87   1.29   2.1    1.02
`
`
`

目标是:

  • 首先,我们需要计算bi,pd,comp和coll的平均值,这些平均值分别按“州”分组为表格区域中的区域因子。由于“地域”表仅包含4个coverage,因此我们假定“地域”表中未表示的coverage的系数为1。

  • 第二,创建一个名为new_earned_premium_dollar_amount的新列,方法是分别将覆盖范围除以州领土因子。例如,在财务表中,第一列的覆盖范围是bi,状态是OH,因此我们需要使用1.7除以领土表中OH的bi的平均数。

我编写了一个SQL查询来确定覆盖率何时为“ coll”,如下所示:

select *,f.earned_premium_dollar_amount/t.avgcoll as new_earned_premium_dollar_amount
from (select *
from finacials) f
left join
(select state,cast(AVG(bi) as decimal(38,2)) avgbi,cast(AVG(pd) as decimal(38,2)) avgpd,cast(AVG(comp) as decimal(38,2)) avgcomp,cast(AVG(coll) as decimal(38,2)) avgcoll
from territories
group by state) t
on t.state=f.state 
where coverage='coll'

结果是:

policy_id   state   coverage earned_premium_dollar_amount state         avgbi   avgpd   avgcomp avgcoll new_earned_premium_dollar_amount
2             OH    coll        13.34                       OH          1.77    1.59    2.32    1.45    9.2
4             OH    coll        18.16                       OH          1.77    1.59    2.32    1.45    12.5241379310345
8             OH    coll        1.13                        OH          1.77    1.59    2.32    1.45    0.779310344827586
12            OH    coll        18.16                       OH          1.77    1.59    2.32    1.45    12.5241379310345
2             TX    coll        13.34                       TX          1.53    1.29    1.97    1.22    10.9344262295082
`
`
`

我只有'coll'的结果。如何获得其余结果并将其合并?同样,我可以通过以下代码获得“ pd”的结果:

select *,f.earned_premium_dollar_amount/t.avgpd as new_earned_premium_dollar_amount
from (select *
from finacials) f
left join
(select state,2)) avgcoll
from territories
group by state) t
on t.state=f.state 
where coverage='pd'

结果是:

policy_id   state   coverage  earned_premium_dollar_amount      state      avgbi    avgpd   avgcomp avgcoll new_earned_premium_dollar_amount
4            OH       pd           8.91                          OH         1.77    1.59       2.32  1.45   5.60377358490566
11           OH       pd           1.3                           OH         1.77    1.59       2.32  1.45   0.817610062893082

问题:

我想我可能会使用join来加入那些结果,但是我不知道该怎么做。 或者,有没有其他方法可以实现我的目标?

···················································· ·································

感谢Bjeran的回答。这段代码有效:

select *,case 
    WHEN f.coverage = 'bi' THEN f.earned_premium_dollar_amount/t.avgbi
    WHEN f.coverage = 'pd' THEN f.earned_premium_dollar_amount/t.avgpd
    WHEN f.coverage = 'comp' THEN f.earned_premium_dollar_amount/t.avgcomp
    WHEN f.coverage = 'coll' THEN f.earned_premium_dollar_amount/t.avgcoll
    else f.earned_premium_dollar_amount/1
    end as 'new_earned_premium_dollar_amount'
from (select *
from finacials) f
left join
(select state,2)) avgcoll
from territories
group by state) t
on t.state=f.state 

最终结果如下所示:

我们如何连接通过SQL中的“ where”语句过滤的多个结果

现在,唯一的问题是状态列出现两次。我可能会考虑使用其他联接,而不是左联接。

whs1234567890 回答:我们如何连接通过SQL中的“ where”语句过滤的多个结果

您可以将案例陈述用于承保的不同案例。 (MySQL语法,其他应该相似) 将此扩展到其他覆盖范围

select *,CASE
    WHEN f.coverage = "bi" THEN f.earned_premium_dollar_amount/t.avgbi
    WHEN f.coverage = "pd" THEN f.earned_premium_dollar_amount/t.avgpd
    WHEN f.coverage = "comp" THEN f.earned_premium_dollar_amount/t.avgcomp
    WHEN f.coverage = "coll" THEN f.earned_premium_dollar_amount/t.avgcol
    ELSE "Coverage unclear"
END AS "new_earned_premium_dollar_amount"
from (select *
from finacials) f
left join
(select state,cast(AVG(bi) as decimal(38,2)) avgbi,cast(AVG(pd) as decimal(38,2)) avgpd,cast(AVG(comp) as decimal(38,2)) avgcomp,cast(AVG(coll) as decimal(38,2)) avgcoll
from territories
group by state) t
on t.state=f.state 
;

我不知道您的表,但是从第一个值开始,内部联接也将获取相同的结果。

本文链接:https://www.f2er.com/3163795.html

大家都在问