PL SQL Group By Issue - PullRequest
       2

PL SQL Group By Issue

0 голосов
/ 18 октября 2018

У меня есть две таблицы T1 и T2.T1 имеет столбец идентификатора, который генерируется как последовательность.Он также имеет два столбца имя и фамилия.

Таблица T2 связана с таблицей T1 через столбец идентификатора (ссылочный).

Таблица T2 имеет столбец зарплаты, который пересматривается каждыйнесколько лет.

Я хочу получить все имя, фамилию, оклад и дату оклада, если оклад изменился.

Я не могу получить эту информацию, используя идентификатор.Второй идентификатор генерируется для той же пары FN и LN, если сотрудник приходит на проверку.

Например: -

ID   FN    LN
1    John  Doe
2    John  Doe

ID   SALARY  DATE     
1    $1       2015     
2    $2       2018    

Я пытаюсь что-то подобное

SELECT T.FN ||'  '|| T.LN AS NAME, COUNT(*) AS CT, 
S.SALARY, S.DATE
SALARYTABLE S, EMP T
WHERE S.ID=T.ID 
HAVING COUNT(*) > 1
GROUP BY (T.FN ||'  '|| T.LN);

Я решил эту проблему с помощью программы на Java.Я должен сохранить все идентификаторы и просмотреть все записи и проверить, совпадают ли FN и LN, а затем извлечь дату и зарплату.Это неэффективно, и я хочу сделать это в PL / SQL.

Пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 18 октября 2018

Что ж, ваша модель данных неверна;Вы не должны полагаться на различение людей по их именам.Что, если еще один «Джон Доу» устроится на работу?

В любом случае: будет ли что-то подобное делать?

  • CTE T1 и T2 имитируют ваши таблицы.Я добавил еще несколько строк, просто чтобы удостовериться, , что следующий запрос тоже не провалится слишком очевидно
  • INTER CTE объединяет эти две таблицы и вычисляет предыдущую зарплату сотрудника (используя LAG function)
  • последний запрос выбирает строки (из INTER), чьи текущая и предыдущая зарплата отличаются

Поскольку у вас уже есть эти таблицы, вы будете использовать строки 16 и далее.

SQL> with
  2    t1 (id, fn, ln) as
  3      (select 1, 'John', 'Doe' from dual union all
  4       select 2, 'John', 'Doe' from dual union all
  5       select 3, 'John', 'Doe' from dual union all
  6       select 5, 'Billy', 'Jean' from dual union all
  7       select 6, 'Billy', 'Jean' from dual
  8      ),
  9    t2 (id, salary, c_date) as
 10      (select 1, 1, 2015 from dual union all
 11       select 2, 2, 2018 from dual union all
 12       select 3, 2, 2019 from dual union all
 13       select 5, 3, 2016 from dual union all
 14       select 6, 3, 2017 from dual
 15      ),
 16  inter as
 17    (select
 18       t1.id, t1.fn, t1.ln,
 19       t2.id, t2.salary, t2.c_date,
 20       lag(t2.salary) over (partition by t1.fn, t1.ln
 21                            order by c_date) prev_salary
 22     from t1 join t2 on t1.id = t2.id
 23    )
 24  select i.fn, i.ln, i.salary, i.c_date
 25  from inter i
 26  where i.salary <> nvl(i.prev_salary, i.salary)
 27  order by i.ln, i.c_date;

FN    LN       SALARY     C_DATE
----- ---- ---------- ----------
John  Doe           2       2018

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...