Aprenda PL/SQL

Query Hierarquica - Como sumarizar valores

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
  

Mensagemem Qui, 07 Jul 2011 2:05 pm

Olá pessoal,

Tenho uma query que retorna os dados abaixo e preciso sumarizar usando o conceito pai X filho, porém os valores estão apenas nos níveis mais baixos (últimos filhos).

Tenho no máximo 4 níveis de hierarquia.

Como faço para sumarizar os respectivos pais?

Preciso deste retorno em uma query.

rating|id_chield|id_parent|VALUE
A|1|null|NULL|
A|2|1|NULL
A|3|2|NULL|
A|4|3|NULL|
A|5|3|100|
A|6|3|NULL|
....
B|1|null|NULL|
B|2|1|NULL|
B|3|2|NULL|
B|4|3|50|
B|5|3|NULL|
B|6|3|60|




Agradeço desde já.

Abs.
sp66d_rac6r
Localização: Sorocaba-SP

Mensagemem Qui, 07 Jul 2011 2:56 pm

Use o CONNECT BY PRIOR. Mas pra gente poder te ajudar melhor é bom você
dar exemplos do seu ambiente também. Tabela, dados de exemplo, etc...
burga
Localização: SP

Ricardo H. Tajiri

Mensagemem Qui, 07 Jul 2011 3:59 pm

Tenho uma tabela de Hierarquia:

ID_CHIELD | ID_PARENT | HIERARQUIA
1 | | DIRETOR
2 | 1 | GERENTE REGIÃO 1
3 | 2 | LÍDER 1 REGIÃO 1
4 | 3 | Funcionario 1
5 | 3 | Funcionario 2
6 | 2 | LÍDER 2 REGIÃO 1
7 | 6 | Funcionario 3
8 | 6 | Funcionario 4
9 | 6 | Funcionario 5
10 | 6 | Funcionario 6
11 | 6 | Funcionario 7
..
31 | 1 | GERENTE REGIÃO 2
32 | 31 | Funcionario 8
33 | 31 | Funcionario 9
34 | 31 | Funcionario 10
35 | 31 | Funcionario 11
36 | 31 | Funcionario 12
37 | 31 | Funcionario 13
38 | 31 | Funcionario 14



Outra tabela com as vendas dos funcionarios (Notem que o valor está apenas com o funcionário e não com seus "parents"):

ID_FUNCIONARIO (ID_CHIELD) | VENDA
33 | 333797300
34 | 41204604.3
36 | 116024774.4
37 | 613123.65


Estou executando um join entre elas com CONNECT BY PRIOR (Notem que novamente os valores estão apenas com o funcionário e não com seus "parents"):

ID_CHIELD | ID_PARENT | HIERARQUIA | | LEVEL (CONNECT BY …) | TOTAL VENDA
1 | | DIRETOR | DIRETOR/ | 1 |
2 | 1 | GERENTE REGIÃO 1 | DIRETOR/GERENTE REGIÃO 1 | 2 |
3 | 2 | LÍDER 1 REGIÃO 1 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1 | 3 |
4 | 3 | Funcionario 1 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 1 | 4 |
5 | 3 | Funcionario 2 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 2 | 4 |
6 | 2 | LÍDER 2 REGIÃO 1 | DIRETOR/GERENTE REGIÃO 1/LÍDER 2 REGIÃO 1 | 3 |
7 | 6 | Funcionario 3 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 3 | 4 |
8 | 6 | Funcionario 4 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 4 | 4 |
9 | 6 | Funcionario 5 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 5 | 4 |
10 | 6 | Funcionario 6 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 6 | 4 |
11 | 6 | Funcionario 7 | DIRETOR/GERENTE REGIÃO 1/LÍDER 1 REGIÃO 1/Funcionario 7 | 4 |
| | | | |
| | | | |
31 | 1 | GERENTE REGIÃO 2 | DIRETOR/GERENTE REGIÃO 2/ | 2 |
32 | 31 | Funcionario 8 | DIRETOR/GERENTE REGIÃO 2/Funcionario 8 | 3 |
33 | 31 | Funcionario 9 | DIRETOR/GERENTE REGIÃO 2/Funcionario 9 | 3 | 333797300
34 | 31 | Funcionario 10 | DIRETOR/GERENTE REGIÃO 2/Funcionario 10 | 3 | 41204604.3
35 | 31 | Funcionario 11 | DIRETOR/GERENTE REGIÃO 2/Funcionario 11 | 3 |
36 | 31 | Funcionario 12 | DIRETOR/GERENTE REGIÃO 2/Funcionario 12 | 3 | 116024774.4
37 | 31 | Funcionario 13 | DIRETOR/GERENTE REGIÃO 2/Funcionario 13 | 3 | 613123.65
38 | 31 | Funcionario 14 | DIRETOR/GERENTE REGIÃO 2/Funcionario 14 | 3 |


Já tentei quase tudo, não consigo "subir" os benditos valores para seus superiores.
sp66d_rac6r
Localização: Sorocaba-SP

Mensagemem Sex, 08 Jul 2011 2:43 pm

Amigo, de acordo com o que entendi do seu exemplo, fiz a seguinte query:
Código: Selecionar todos
select id_parent, id_chield, hierarquia, sum(vendas) over (partition by id_parent) as vendas
  from (select s.id_parent,s.id_chield,s.hierarquia, nivel, nvl(v.venda,0) as vendas
          from vendas v,
               (select id_parent,
                       id_chield,
                       hierarquia,
                       level as nivel
                  from hierarquia h
                  start with h.id_chield = 1
                connect by prior id_chield = id_parent) s
         where s.id_chield = v.id_chield(+));


Espero ter ajudado.
lmendes.cps
Localização: Campinas - SP

Mensagemem Qui, 21 Jul 2011 3:13 pm

Dê uma olhada no meu http://www.fabioprado.net/2011/06/consu ... eries.html. acho que ele pode te ajudar a escrever a query para retornar o que você precisa! Eu tbém explico sobre como utilizar query hierárquica no meu treinamento de tuning (http://www.fabioprado.net/p/treinamentos.html).

[]

Fábio Prado
www.fabioprado.net
fbifabio
Localização: São Paulo - SP



Voltar para DBA Tuning

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante