Как объединить две таблицы на основе условия в sql? - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно объединить две таблицы с соответствующими двумя столбцами

  1. Stu_id (Таблица 1) - Stu_id (Таблица 2)
  2. Perf_yr (Таблица 1) - yr_month (Таблица 2) )

perf_yr начинается каждый год с сентября по август. Perf_yr должно соответствовать yr_month на основе Perf_yr начала и конца месяца

Таблица 1

Stu_id    Roll_No    Avg_marks  Perf_yr 
 1       100244         72      2017
 2       200255         62      2018
 3       100246         68      2019

Таблица 2

Stu_id   Subject    Marks   yr_month
 1      Maths      70      201609
 1      Science    69      201701   
 1      Social     74      201712 
 2      Maths      60      201709
 2      Science    61      201801   
 2      Social     62      201808
 3      Maths      65      201810
 3      Science    64      201912   
 3      Social     72      201902

Вывод

Stu_id    Roll_No    Avg_marks  Perf_yr Subject  Marks  yr_month
 1       100244         72      2017     Maths   70    201609
 1       100244         72      2017     Science 70    201701
 2       200255         62      2018     Maths   60    201709
 2       200255         62      2018     Science 61    201801 
 2       200255         62      2018     Social  62    201808
 3       100246         68      2019     Maths   65    201810
 3       100246         68      2019     Science 64    201912
 3       100246         68      2019     Social  72    201902

Я ПЫТАЛСЯ:

SELECT A.*, B.* FROM 

(SELECT * FROM TABLE1 )A
LEFT JOIN
(SELECT * FROM TABLE)B
ON 
A.Stu_id = B.Stu_id
AND
A.Perf_yr = B.Yr_Month

НО ЭТО НЕ ПОЛУЧИТ ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ, ПОТОМУ ЧТО СОСТОЯНИЕ НЕ СООТВЕТСТВУЮЩАЯ ИДЕАЛЬНОЙ ДАТЕ НАЧАЛА И КОНЦА.

1 Ответ

2 голосов
/ 26 марта 2020

Вам необходимо проанализировать, например, 201609 как дату, добавить к ней 4 месяца, а затем сопоставить ее с годом из другой таблицы. Добавление 4 месяцев преобразует диапазон дат 201609-201708 в 201701-201712 - нам важна только часть года:

SELECT * FROM
   t1
   INNER JOIN t2
   ON
     t1.stu_id = t2.stu_id AND
     t1.Perf_yr  = EXTRACT(year FROM ADD_MONTHS(TO_DATE(t2.yr_month, 'YYYYMM'), 4))

Это oracle. Тот же лог c будет работать для SQLS, вам просто нужно настроить используемые функции -

CONVERT(date, t2.yr_month+'01', 112) -- Convert yyyymmdd to a date
DATEADD(month, x, 4) -- add 4 months to x
YEAR(x) -- extract year from date x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...