Sql 和内条件逻辑

Sql 和内条件逻辑,sql,sql-server,Sql,Sql Server,我目前正在通过UNIONALL查询组合两个表,并对结果执行SUM和GROUPBY操作。一切都按预期进行,但我有一个独特的需求,我似乎不知道如何实现。 我的目标是编写SQL,当DEV_AGE列大于等于12时,将收入值设置为该列为12时的值。我提供以下代码,因为我知道此描述可能有点混乱: 收入表: ACC_YR DEV_AGE STATE REVENUE LOSS 2012 3 MA 4000 0 2012 6

我目前正在通过UNIONALL查询组合两个表,并对结果执行SUM和GROUPBY操作。一切都按预期进行,但我有一个独特的需求,我似乎不知道如何实现。 我的目标是编写SQL,当DEV_AGE列大于等于12时,将收入值设置为该列为12时的值。我提供以下代码,因为我知道此描述可能有点混乱:

收入表:

ACC_YR    DEV_AGE   STATE   REVENUE LOSS
2012        3         MA     4000    0
2012        6         MA     8000    0
2012        9         MA     12000   0
2012        12        MA     16000   0
损失表:

ACC_YR    DEV_AGE   STATE   REVENUE LOSS
2012        3         MA     0       2000
2012        6         MA     0       7000
2012        9         MA     0       9000
2012        12        MA     0       10000
2012        15        MA     0       14000
2012        18        MA     0       14000
2012        21        MA     0       14000
2012        24        MA     0       15000
2012        27        MA     0       17000
UNION ALL、GROUP BY、SUM后的表格:

ACC_YR    DEV_AGE   STATE   REVENUE LOSS
2012        3         MA     4000    2000
2012        6         MA     8000    7000
2012        9         MA     12000   9000
2012        12        MA     16000   10000
2012        15        MA     0       14000
2012        18        MA     0       14000
2012        21        MA     0       14000
2012        24        MA     0       15000
2012        27        MA     0       17000
我想要完成的是:

ACC_YR    DEV_AGE   STATE   REVENUE LOSS
2012        3         MA     4000    2000
2012        6         MA     8000    7000
2012        9         MA     12000   9000
2012        12        MA     16000   10000
2012        15        MA     16000   14000
2012        18        MA     16000   14000
2012        21        MA     16000   14000
2012        24        MA     16000   15000
2012        27        MA     16000   17000

换句话说,我的收入在12岁时停止增长。12岁以后,收入表中没有任何行,但我希望12岁以后的每个发展年龄都等于最后一个表中12岁时的收入。

这里有一种方法,使用窗口函数计算12岁时的收入,然后用逻辑分配它:

select acc_yr, dev_age, state,
       (case when dev_age > 12 then rev12 else revenue end) as revenue, loss
from (select l.acc_yr, l.dev_age, l.state, r.revenue, l.loss,
             max(case when l.dev_age = 12 then r.revenue end) over (partition by l.acc_yr, l.state) as rev12
      from loss l left join
           revenue r
           on l.acc_yr = r.acc_yr and l.dev_age = r.dev_age and l.state = dev.state
     ) lr;

您在输出表中的收入字段的代码是什么?@Matt,目前它只是简单的SUMREVENUE,因为我甚至不知道从何处开始这个要求。很容易完成一个案例,请参见下面的答案。如果我想将此逻辑应用于最终的组合表,而不是混乱连接,那么下面的代码会起作用吗:选择acc_yr,dev_age,状态,当dev_age>12时的情况,然后rev12其他收入作为收入结束,选择acc_yr的损失,dev_age,状态,收入,损失,当dev_age=12时的最大情况,然后收入按acc_yr结束分区,状态为rev12从合并