ORACLE SQL: как связать 2 таблицы, у которых нет общего unid - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в ORACLE SQL, и у меня есть вопрос о связывании 2 таблиц, у которых нет общего unid.У меня 2 таблицы: работа и море.таблица заданий связана с таблицей моря через соединение с заданием lotno ref job unid.Я хотел бы получить тип контейнера и количество контейнеров для всего лота.

Вот некоторые примеры данных.

Таблица JOB:

| unid  | lotno      | shipno      | etd    | eta    |
+-------+------------+-------------+--------+--------+
| 10001 | SHSEM01198 | SHASEH00801 | 13-May | 11-Jun |
| 10002 | SHSEM01198 | SHASEH00816 | 13-May | 11-Jun |
| 10003 | SHSEM01198 | SHASEH00818 | 13-May | 11-Jun |
| 10004 | SHSEM01198 | SHASEH00820 | 13-May | 11-Jun |
| 10005 | SHSEM01198 | SHASEH00823 | 13-May | 11-Jun |
| 10006 | SHSEM01198 | SHASEH00843 | 13-May | 11-Jun |
| 10007 | SHSEM01198 | SHASEH00844 | 13-May | 11-Jun |
| 10008 | SHSEM01198 | SHASEH00847 | 13-May | 11-Jun |
| 10009 | SHSEM01198 | SHASEH00851 | 13-May | 11-Jun |
| 10010 |            | SHSEM01198  | 13-May | 11-Jun |
+-------+------------+-------------+--------+--------+

Таблица SEA

| job_unid | containerno | conttype |
+----------+-------------+----------+
| 10010    | TSLU55820   | 40HC     |
| 10010    | CAIU69851   | 40HC     |
| 10010    | TKLU56578   | 40HC     |
| 10010    | MASC5008    | 20ST     |
| 10010    | DESU5587    | 20ST     |
+----------+-------------+----------+

Желаемый результат

| lotno          | shipno      | etd    | eta    | Conttype1 | Conttype1_qty | Conttype2 | Conttype2_Qty | Conttype3 | Conttype3_Qty |
+----------------+-------------+--------+--------+-----------+---------------+-----------+---------------+-----------+---------------+
| SHSEM01198     | SHASEH00801 | 13-May | 11-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00816 | 13-May | 12-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00818 | 13-May | 13-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00820 | 13-May | 14-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00823 | 13-May | 15-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00843 | 13-May | 16-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00844 | 13-May | 17-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00847 | 13-May | 18-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
| SHSEM01198     | SHASEH00851 | 13-May | 19-Jun | 40HC      | 3             | 20ST      | 2             |           |               |
+----------------+-------------+--------+--------+-----------+---------------+-----------+---------------+-----------+---------------+

У lotno также есть шпно и унид, который являетсяссылка на море таблицы.

Очень признателен, если у кого-нибудь есть какие-либо предложения по этому поводу!

1 Ответ

0 голосов
/ 15 мая 2018

Вот что я считаю заданием:

  1. Вы ищете записи о работе с lotno.
  2. У каждой из этих записей заданий есть еще одна заданная запись, чей номер соответствует ее номеру.
  3. Теперь вы хотите посчитать морские записи по job_unid и conttype и присоединить этот результат к заданиям.
  4. Однако вам не нужен список всех комбинаций «работа-море», а только список работ, каждая из которых содержит до трех типов контента для моря.

Чтобы достичь последнего, вы должны пронумеровать свои агрегированные морские ряды.

with s as
(
  select
    job_unid,
    conttype,
    count(*) as qty,
    row_number() over (partition by job_unid order by conttype) as rn
  from sea
  group by job_unid, conttype
)
select
  j1.lotno, j1.shipno, j1.etd, j1.eta,
  s1.conttype as conttype1, s1.qty as conttype1_qty,
  s2.conttype as conttype2, s2.qty as conttype2_qty,
  s3.conttype as conttype3, s3.qty as conttype3_qty
from job j1
join job j2 on j2.shipno = j1.lotno
left join s s1 on s1.job_unid = j2.unid and s1.rn = 1
left join s s2 on s2.job_unid = j2.unid and s2.rn = 2
left join s s3 on s3.job_unid = j2.unid and s3.rn = 3
order by j1.lotno, j1.shipno;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...