Двухуровневый древовидный запрос

Рейтинг: 2Ответов: 2Опубликовано: 17.07.2023

Существуют следующие вводные

Таблица (в рабочем примере выглядит как запрос)

CREATE TABLE your_table_name (
  m_id NUMBER,
  name VARCHAR2(255),
  ind NUMBER
);

Данные

INSERT INTO your_table_name (m_id, name, ind)
VALUES
(1, 'John', 1),
(1, 'John', 2),
(2, 'Alice', 1),
(2, 'Alice', 2),
(3, 'Acinit', 1),
(3, 'Acinit', 3),
(3, 'Acinit', 2),
(4, 'Test', 1);
M_ID NAME IND
1 John 1
1 John 2
2 Alice 1
2 Alice 2
3 Acinit 1
3 Acinit 3
3 Acinit 2
4 Test 1

Необходимо создать такой запрос, при котором от каждого ind формируются группы т.е.

m_id name ind
group1 1
1 John 1
2 Alice 1
3 Acinit 1
4 Test 1
group2 2
1 John 2
2 Alice 2
3 Acinit 2
group3 3
3 Acinit 3

Группы формируются внутри запроса от dual.

select
null as m_id, 'group1' as name, 1 as ind from dual
union all
select 
null as m_id, 'group2' as name, 2 as ind from dual
union all
select 
null as m_id, 'group3' as name, 3 as ind from dual

P.S. Среда в db<>fiddle если кому потребуется

Ответы

▲ 2Принят

Если строки group1, group2... надо формировать на лету, то можно примерно так:

select m_id, decode(grouping(m_id), 0, name, 'group'||ind) name, ind
from your_table_name 
group by grouping sets((m_id, name, ind), ind)
order by ind, grouping(m_id) desc, m_id
▲ 2

Советую попробовать этот запрос:

SELECT NULL AS m_id, 'group1' AS name, 1 AS ind FROM dual
UNION ALL
SELECT m_id, name, ind FROM your_table_name WHERE ind = 1
UNION ALL
SELECT NULL AS m_id, 'group2' AS name, 2 AS ind FROM dual
UNION ALL
SELECT m_id, name, ind FROM your_table_name WHERE ind = 2
UNION ALL
SELECT NULL AS m_id, 'group3' AS name, 3 AS ind FROM dual
UNION ALL
SELECT m_id, name, ind FROM your_table_name WHERE ind = 3

Он выведет следующий результат:

M_ID    NAME    IND
(null)  group1  1
1   John    1
2   Alice   1
3   Acinit  1
4   Test    1
(null)  group2  2
1   John    2
2   Alice   2
3   Acinit  2
(null)  group3  3
3   Acinit  3

Это тот результат, который Вы хотели бы видеть?