Пользовательский SQL ответ (JOIN TABLE) - PullRequest
4 голосов
/ 29 января 2020

У меня есть две таблицы, table1 и table2

Я хочу связать две таблицы с id, сгруппировав информацию в один и тот же ответ.

table1 :

╔════╦══════════════╦
║ id ║  product_id  ║
╠════╬══════════════╬
║  1 ║      123     ║
║  2 ║      456     ║
║  3 ║      789     ║
╚════╩══════════════╩

table2 :

╔════╦══════════════╦══════════════╦
║ id ║    status    ║     date     ║
╠════╬══════════════╬══════════════╬
║  1 ║   received   ║    02/20     ║
║  1 ║   shipped    ║    03/20     ║
║  2 ║   received   ║    04/20     ║
║  2 ║   shipped    ║    05/20     ║
║  3 ║   received   ║    06/20     ║
║  3 ║   shipped    ║    07/20     ║
╚════╩══════════════╩══════════════╩

Я хочу этот вывод:

╔════╦══════════════╦══════════════╦══════════════╦
║ id ║    r_date    ║   s_date     ║  product_id  ║
╠════╬══════════════╬══════════════╬══════════════╬
║  1 ║     02/20    ║    03/20     ║     123      ║
║  2 ║     04/20    ║    05/20     ║     456      ║
║  3 ║     06/20    ║    07/20     ║     789      ║
╚════╩══════════════╩══════════════╩══════════════╩

Как Могу ли я получить этот результат?

Ответы [ 2 ]

3 голосов
/ 29 января 2020

Вы можете сделать условную агрегацию в сводную область table2 более table1:

select 
    t1.id, 
    max(case when t2.status = 'received' then t2.date end) r_date,
    max(case when t2.status = 'shipped' then t2.date end) s_date,
    t1.product_id
from table1 t1
inner join table2 t2 on t.id = t2.id
group by t1.id, t2.product_id
order by t1.id
1 голос
/ 29 января 2020

Вы можете использовать два LEFT JOIN с, как в:

select
  a.id,
  r.date as r_date,
  s.date as s_date,
  a.product_id
from table1 a
left join table2 r on r.id = a.id and r.status = 'received'
left join table2 s on s.id = a.id and s.status = 'shipped'
...