Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархические (рекурсивные) запросы / 17 сообщений из 17, страница 1 из 1
16.07.2018, 17:06
    #39674607
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
В иерархическом запросе надо вывести сумму по строкам для подчинённых ( т.е без начальника ) , не получается это сделать , не могли бы вы подсказать как это сделать.
Заранее благодарю.
...
Рейтинг: 0 / 0
16.07.2018, 17:09
    #39674608
Vadim Lejnin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.kaВ иерархическом запросе надо вывести сумму по строкам для подчинённых ( т.е без начальника ) , не получается это сделать , не могли бы вы подсказать как это сделать.
Заранее благодарю.
Для начала покажи что у тебя получилось и тестовые данные в виде
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
with tabname(col1,col2,...) as (
select x1,y2,z3 from dual union all
....
select xN,yN,zN from dual
)
select ...
from tabname
...



И в правильном оформлении
...
Рейтинг: 0 / 0
16.07.2018, 17:23
    #39674618
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Запрос такой
SELECT lpad(' ', 3*level)||Boss as Tree,LEVEL , SYS_CONNECT_BY_PATH(name, '/') AS PATH FROM my_table2 a
start with id=1 connect by prior id=Boss
ORDER SIBLINGS BY NAME
На фото вывод
Нужно добавить столбец с суммой зарплаты подчинённых без босса
...
Рейтинг: 0 / 0
17.07.2018, 13:55
    #39675032
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Необходимо подсчитать Сумму дочерних строк каждого уровня рекурсии без корневой строки
...
Рейтинг: 0 / 0
17.07.2018, 15:28
    #39675114
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.ka,

1. Вас просили сделать тестовые данные, а Вы их не сделали
2. Вас спросили что получилось у Вас и что не получается - Вы так-же не ответили (т.е. в Вашем ответе со скрином нет суммы, нет тестовой таблицы, нет суммы которую Вы получили и того что Вы хотели получить)

т.о. Вы пока не сделали ничего чтобы хотя-бы разогнать туман в моем хрустальном шаре.
...
Рейтинг: 0 / 0
17.07.2018, 15:50
    #39675124
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.kaЗапрос такой
SELECT lpad(' ', 3*level)||Boss as Tree,LEVEL , SYS_CONNECT_BY_PATH(name, '/') AS PATH FROM my_table2 a
start with id=1 connect by prior id=Boss
ORDER SIBLINGS BY NAME
выдаёт ошибку ORA-00942: table or view does not exist
...
Рейтинг: 0 / 0
17.07.2018, 16:03
    #39675132
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Таблица


CREATE TABLE my_table2 (id number, Boss number, NAME VARCHAR2(50) , zp NUMBER );


INSERT INTO my_table2 VALUES ( 1 ,0, 'Pushkin', 1);
INSERT INTO my_table2 VALUES (2, 1, 'Gvidon' , 2 );
INSERT INTO my_table2 VALUES (3, 1, 'Rzevsii', 3);
INSERT INTO my_table2 VALUES (4, 3, 'Dubrovski', 5);
INSERT INTO my_table2 VALUES (5, 4, 'Petr1', 4);
INSERT INTO my_table2 VALUES (6, 5, 'Nevski', 4);
INSERT INTO my_table2 VALUES (7, 3,'Ruslan', 2);
INSERT INTO my_table2 VALUES (22, 0, 'Ludmila' , 2 );
INSERT INTO my_table2 VALUES (8, 7, 'Gaivata', 4);
INSERT INTO my_table2 VALUES (9, 2, 'Gendalf', 5);
INSERT INTO my_table2 VALUES (10, 9, 'Sofia' , 4);
INSERT INTO my_table2 VALUES (11, 10, 'Alice' , 5);
INSERT INTO my_table2 VALUES (12, 2, 'Santa' , 11);
INSERT INTO my_table2 VALUES (13, 14, 'Satana' , 4);
INSERT INTO my_table2 VALUES (14, 0, 'God' , 2);
INSERT INTO my_table2 VALUES (15, 14, 'Michael' , 5);
INSERT INTO my_table2 VALUES (16, 13, 'Azzazel' , 3);
INSERT INTO my_table2 VALUES (17, 14, 'Begemot' , 4);
INSERT INTO my_table2 VALUES (18, 17, 'Voland' , 5);
INSERT INTO my_table2 VALUES (19, 18, 'Maste_r' , 5);
INSERT INTO my_table2 VALUES (20, 14, 'Berlioz' , 1);
INSERT INTO my_table2 VALUES (21, 1, 'Raskolnikov' , 6);
INSERT INTO my_table2 VALUES (22, 21, 'Marmeladov' , 6);
...
Рейтинг: 0 / 0
17.07.2018, 16:12
    #39675136
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.ka,

Ok. пункт 1 пройден

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
with  my_table2 (id, Boss, NAME, zp) as (
select 1 ,0, 'Pushkin', 1 from dual union all
select 2, 1, 'Gvidon' , 2 from dual union all
select 3, 1, 'Rzevsii', 3 from dual union all
select 4, 3, 'Dubrovski', 5 from dual union all
select 5, 4, 'Petr1', 4 from dual union all
select 6, 5, 'Nevski', 4 from dual union all
select 7, 3,'Ruslan', 2 from dual union all
select 22, 0, 'Ludmila' , 2 from dual union all
select 8, 7, 'Gaivata', 4 from dual union all
select 9, 2, 'Gendalf', 5 from dual union all
select 10, 9, 'Sofia' , 4 from dual union all
select 11, 10, 'Alice' , 5 from dual union all
select 12, 2, 'Santa' , 11 from dual union all
select 13, 14, 'Satana' , 4 from dual union all
select 14, 0, 'God' , 2 from dual union all
select 15, 14, 'Michael' , 5 from dual union all
select 16, 13, 'Azzazel' , 3 from dual union all
select 17, 14, 'Begemot' , 4 from dual union all
select 18, 17, 'Voland' , 5 from dual union all
select 19, 18, 'Maste_r' , 5 from dual union all
select 20, 14, 'Berlioz' , 1 from dual union all
select 21, 1, 'Raskolnikov' , 6 from dual union all
select 22, 21, 'Marmeladov' , 6 from dual)

SELECT lpad(' ', 3*level)||Boss as Tree,LEVEL , SYS_CONNECT_BY_PATH(name, '/') AS PATH FROM my_table2 a 
start with id=1 connect by prior id=Boss
ORDER SIBLINGS BY NAME



Переходим к пункту 2 что за суммы получились и какие надо получить?
...
Рейтинг: 0 / 0
17.07.2018, 18:48
    #39675230
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
MaximaXXL,

мб это нужно? 1833945
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
with  my_table2 (id, Boss, NAME, zp) as (
select 1 ,0, 'Pushkin', 1 from dual union all
select 2, 1, 'Gvidon' , 2 from dual union all
select 3, 1, 'Rzevsii', 3 from dual union all
select 4, 3, 'Dubrovski', 5 from dual union all
select 5, 4, 'Petr1', 4 from dual union all
select 6, 5, 'Nevski', 4 from dual union all
select 7, 3,'Ruslan', 2 from dual union all
select 8, 7, 'Gaivata', 4 from dual union all
select 9, 2, 'Gendalf', 5 from dual union all
select 10, 9, 'Sofia' , 4 from dual union all
select 11, 10, 'Alice' , 5 from dual union all
select 12, 2, 'Santa' , 11 from dual union all
select 13, 14, 'Satana' , 4 from dual union all
select 14, 0, 'God' , 2 from dual union all
select 15, 14, 'Michael' , 5 from dual union all
select 16, 13, 'Azzazel' , 3 from dual union all
select 17, 14, 'Begemot' , 4 from dual union all
select 18, 17, 'Voland' , 5 from dual union all
select 19, 18, 'Maste_r' , 5 from dual union all
select 20, 14, 'Berlioz' , 1 from dual union all
select 21, 1, 'Raskolnikov' , 6 from dual union all
select 22, 21, 'Marmeladov' , 6 from dual)
select  lpad(' ',2 * (level - 1)) || name ename,
         zp,
         (
          select  sum(zp)
            from  my_table2 b
            start with b.boss = a.id
            connect by prior id = boss
         ) total_child_sal
   from  my_table2 a
   start with id=1
   connect by prior id=Boss
   ORDER SIBLINGS BY NAME
...
Рейтинг: 0 / 0
18.07.2018, 09:55
    #39675436
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
feagor, Примерно , спасибо , теперь осталось только убрать
имя Начальников из запроса
...
Рейтинг: 0 / 0
18.07.2018, 10:31
    #39675469
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.ka,

В процессе постановки задачи Вы имеете уровень БОГ.

Кто в вашем примере - Начальник?
До сих пор не понятно какие суммы Вы хотели увидеть.
...
Рейтинг: 0 / 0
18.07.2018, 10:35
    #39675479
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
MaximaXXL, С суммами уже все решилось , осталось только из запроса (SELECT lpad(' ', 3*level)||NAME as Tree ,LEVEL , SYS_CONNECT_BY_PATH(name, '/') AS PATH FROM my_table2 a
start with id=1 connect by prior id=Boss
ORDER SIBLINGS BY NAME ) в третьем столбце убрать имя которое соответствует ему в первой строке , точнее просто убрать его имя
, если PUshkin то убрать его имя в 3 столбце его строки и т.д.
...
Рейтинг: 0 / 0
18.07.2018, 10:46
    #39675493
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.kaMaximaXXL, С суммами уже все решилось , осталось только из запроса (SELECT lpad(' ', 3*level)||NAME as Tree ,LEVEL , SYS_CONNECT_BY_PATH(name, '/') AS PATH FROM my_table2 a
start with id=1 connect by prior id=Boss
ORDER SIBLINGS BY NAME ) в третьем столбце убрать имя которое соответствует ему в первой строке , точнее просто убрать его имя
, если PUshkin то убрать его имя в 3 столбце его строки и т.д.

Нет, уровень уходит в Старший БОГ.

убрать строчку
Код: plsql
1.
where level != 1


убрать его имя в 3 столбце его строки
Код: plsql
1.
decode(level,1,null,SYS_CONNECT_BY_PATH(name, '/')) AS PATH,
...
Рейтинг: 0 / 0
18.07.2018, 10:51
    #39675496
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
MaximaXXL, Спасибо за подсказку , я имел ввиду что для каждой строки надо убрать её имя в третьем столбце , для пушкина это пушкин , для гвидона это гвидон и т.д.

1 Sofia /Pushkin/Gvidon/Gendalf/

Без Софии
...
Рейтинг: 0 / 0
18.07.2018, 11:01
    #39675504
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.ka,

Ну если совсем влоб, просто откусить substr or regexp_substr
Код: plsql
1.
substr(SYS_CONNECT_BY_PATH(name, '/'),1,instr(SYS_CONNECT_BY_PATH(name, '/'),'/',-1)) AS PATH,
...
Рейтинг: 0 / 0
18.07.2018, 11:11
    #39675510
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
Pol.ka,

Можно так
Код: plsql
1.
SYS_CONNECT_BY_PATH(prior name, '/') as PATH
...
Рейтинг: 0 / 0
18.07.2018, 16:04
    #39675752
Pol.ka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархические (рекурсивные) запросы
MaximaXXL, Всё вышло чудесно , крайне благодарен.
Теперь задача сложнее , необходимо получить всё тоже самое только через WIth
Вот что вышло у меня


with rec(lvl, ID , NAME , zp , boss ) as
(
select 1 lvl, ID , NAME , ZP , boss
from my_table2
union ALL
select r.lvl + 1, t.id , t.NAME , t.ZP , t.boss from my_table2 t join rec r on t.boss = r.id
) select lvl, lpad(' ', 10*lvl)||NAME , rpad(' ', (lvl - 1) * 3, ' ') || id as ID , NAME , ZP , boss from rec

При попытке ORDER SIBLNGS не работает и также надо работать с суммой
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархические (рекурсивные) запросы / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]