Разобрать 2 записи в одну и объединить таблицы - PullRequest
0 голосов
/ 04 декабря 2018

Отзыв

    +----+--------------------- +------+-------+
    | id |   POS  |  Review Date| Role |app ID |
    +----+----------------------+------+-------+
    |  1 |   A    | 2018-12-03  |  E   |  170  |
    |  2 |   A    | 2018-12-04  |  P   |  170  |
    |  3 |   B    | 2018-12-01  |  E   |  180  |
    |  4 |   B    | 2018-12-05  |  P   |  180  |
    |  5 |   B    | 2018-12-05  |  X   |  190  |
    |  6 |   B    | 2018-12-05  |  w   |  195  |
    |  7 |   C    | 2018-12-06  |  w   |  170  |
    +----+--------+-------------+------+-------+

Call_Center

    +----+------+-----+------+
    | id |  POS |  Emp|  yrs |
    +----+------+-----+------+
    |  1 |   A  |  F  |   4  |
    |  2 |   B  |  F  |   3  |
    |  3 |   C  |  P  |   3  |
    +----+------+-----+------+

Требуется колл-центр;Кроме того, забыл, что может быть много ролей (x, w, u, t), но просто заинтересован в объединении проверенной даты для ролей E и P.

Необходимо вернуть одну запись для каждого уникального POS, включая обаreview_dates ТОЛЬКО для ролей E и P;только идентификатор приложения 170;EMP и год от call_center, присоединение к POS

Например:

POS Review_Date(role E) Review_Date(role P) EMP Yrs app ID
A   2018-12-03          2018-12-04           F   4   170

См. Обновленные таблицы

Синтаксис Oracle, пожалуйста

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018
select A.POS, A.review_date as review_date1, a.ROLE as ROLE1, B.review_date as 
review_date2, B.ROLE as ROLE2
from reviewed a
left join reviewed b
on a.POS = b.POS
and a.review_date < b.review_date
where B.ROLE is not null
;
0 голосов
/ 04 декабря 2018

Вы можете использовать case when, чтобы отфильтровать даты, соответствующие желаемой роли, и объединить это с group bymax):

select Pos,
       max(case Role when 'E' then review_date end) review_E,
       max(case Role when 'P' then review_date end) review_P
from reviewed
group by Pos

Вы также можете использовать pivotпредложение доступно с Oracle 11g:

select *
from (
    select Pos, Role, review_date
    from reviewed
)
pivot 
(
    max(review_date)
    for Role
    in ('E', 'P')
);
0 голосов
/ 04 декабря 2018

Я бы использовал два CTE:

with
e as (
  select * from reviewed where role = 'E'
),
p as (
  select * from reviewed where role = 'P'
)
select
  coalesce(e.pos, p.pos) as pos,
  e.review_date as review_date_role_e,
  p.review_date as review_date_role_p
from e
full outer join p on e.pos = p.pos
order by coalesce(e.pos, p.pos)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...