SQL连接与新列计算相结合

时间:2019-04-04 12:07:11

标签: sql-server join

我在SQL中有两个看起来像这样的表:

表1:

ID    TaxYear    Earnings
01       2000        2234
01       2001         123
02       2004       12344
02       2006         234
02       2007           0
02       2008         123

表2:

ID    JobEnd
01      1998
02      2000
02      2007       

我需要合并这些表以创建一个新列,以提供TaxYear和JobEnd之间的年数。但是,每次TaxYear经过新的JobEnd年时,我都需要重置此值。所以我的决赛桌看起来像这样:

ID    TaxYear    Earnings    YearsSinceJobEnd
01       2000        2234                   2
01       2001         123                   3
02       2004       12344                   4
02       2006         234                   6
02       2007           0                   7
02       2008         123                   1

对于ID 02,当YearsSinceJobEnd计算为TaxYear减2000时,直到TaxYear超过新的JobEnd年2007,随后将其计算为TaxYear减2007。

我对如何执行此操作感到非常困惑。如果我加入表,那么每个TaxYear最终会有多列,我需要避免。但是我不考虑如何在不加入新列的情况下计算新列。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以将datediff()DATETIMEFROMPARTS ()结合使用:

select t1.id, t1.TaxYear, t1.Earnings, 
       datediff(year, DATEFROMPARTS(t2.JobEnd, 1, 1), DATEFROMPARTS(t1.TaxYear, 1, 1)) as YearsSinceJobEnd
from t1 inner join
     t2
     on t2.id = t1.id;

如果您不想使用JOIN,请使用APPLY

select t1.id, t1.TaxYear, t1.Earnings,
       datediff(year, DATEFROMPARTS(t2.JobEnd, 1, 1), DATEFROMPARTS(t1.TaxYear, 1, 1)) as YearsSinceJobEnd  
from t1 cross apply
     ( select top (1) t2.JobEnd 
       from t2
       where t2.id = t1.id and t2.JobEnd < t1.TaxYear
       order by t2.JobEnd desc
     ) t2;

答案 1 :(得分:1)

您可以使用CROSS APPLY来找到每个ID所需的JobEnd

SELECT t1.ID, t1.TaxYear, t1.Earnings,
       YearsSinceJobEnd = t1.TaxYear - e.JobEnd
FROM   Table1 t1
       CROSS APPLY
       (
           SELECT JobEnd = MAX(t2.JobEnd)
           FROM   Table2 t2
           WHERE  t2.ID = t1.ID
           AND    t2.JobEnd < t1.TaxYear
       ) e