我在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最终会有多列,我需要避免。但是我不考虑如何在不加入新列的情况下计算新列。
任何帮助将不胜感激。
答案 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