В Oracle запрос восстанавливает этот набор данных

DEPT | EMP_NAME | SALARY
-----+----------+-------
10   | MARY     | 30000
10   | JOHN     | 20000
10   | SCOTT    | 20000
20   | BOB      | 50000
20   | BETTY    | 50000

Моя цель - сделать это как показано ниже

DEPT | EMP_NAME | SALARY
-----+----------+-------
10   | MARY     | 30000
     | JOHN     | 20000
     | SCOTT    | 20000
20   | BOB      | 50000
     | BETTY    | 50000

Имя депа должно появиться сразу, пока не начнется новый деп.

0
Shoaib Ahmed 21 Ноя 2018 в 18:40

1 ответ

Лучший ответ

Предполагая, что ваши результаты упорядочены по отделу, имени сотрудника, вы можете использовать функцию LAG, чтобы найти первую строку для каждого отдела. Вам нужно будет проверить каждую строку, чтобы увидеть, есть ли в ней другой отдел, чем в предыдущей строке, примерно так:

SELECT CASE /* Check if there's a different department number on this row compared to the previous row */
         WHEN NVL(LAG(t.dept) OVER (ORDER BY t.dept, t.emp_name),-1) <> t.dept /* If previous row is null (ie, this is the first row), use -1 as previous dept number so comparison does not fail */
         THEN t.dept
       END AS display_dept,
       t.emp_name,
       t.salary
FROM myTable t
ORDER BY t.dept, t.emp_name

Тем не менее, как отмечали другие, на самом деле SQL не предназначен для этого; было бы гораздо лучше, если бы эта логика присутствовала во всем, что отображает результаты запроса, чем в самом запросе.

0
Josh Eller 21 Ноя 2018 в 16:05