Query Hierarquica - Como sumarizar valores

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
sp66d_rac6r
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 02 Dez 2008 10:43 am
Localização: Sorocaba-SP

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.

Selecionar tudo

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.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

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...
sp66d_rac6r
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 02 Dez 2008 10:43 am
Localização: Sorocaba-SP

Tenho uma tabela de Hierarquia:

Selecionar tudo

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"):

Selecionar tudo

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"):

Selecionar tudo

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.
lmendes.cps
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 13
Registrado em: Seg, 20 Jun 2011 2:14 pm
Localização: Campinas - SP

Amigo, de acordo com o que entendi do seu exemplo, fiz a seguinte query:

Selecionar tudo

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.
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:

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
Maioli
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 08 Set 2010 11:49 am
Localização: São Paulo-SP

Veja o exemplo em https://www.linkedin.com/post/edit/plsq ... ADs-maioli, nesse artigo eu explico de forma detalha e com exemplos em PL/SQL.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes