SQL-соединение в сочетании с вычислением новых столбцов - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть две таблицы в 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

Для идентификатора 02, когда YearsSinceJobEnd рассчитывается как TaxYear минус 2000, до тех пор, пока TaxYear не пройдет новый год JobEnd 2007, когда он впоследствии будет рассчитан как TaxYear минус 2007.

Я очень растерялся из-за того, как это сделать. Если я присоединяюсь к таблицам, я получаю несколько столбцов на TaxYear, которых мне следует избегать. Но я не могу думать, как рассчитать новый столбец, не присоединяясь к ним.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы можете использовать 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 голос
/ 04 апреля 2019

вы можете использовать CROSS APPLY, чтобы найти необходимые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...