Re: [oracle_br] Re: Desafio SQL

2014-05-29 Por tôpico 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
Então Flávio, essa parte de concatenar as strings pelo menos pra mim era
mais tranquilo...
O grande pulo do gato na minha opinião pra montar essa solução foram as
funções analíticas, principalmente o BITAND.



Em 28 de maio de 2014 17:56, flavio_brune...@yahoo.com [oracle_br] <
oracle_br@yahoogrupos.com.br> escreveu:

>
>
> Olha o que achei... para todos os gostos, vale como estudo.
>
> ORACLE-BASE - String Aggregation 
> Techniques
>[image: image]
> 
>  ORACLE-BASE - String Aggregation Techniques
> 
> ORACLE-BASE - String Aggregation Techniques
>   Visualizar em www.oracle-bas...
> 
>   Visualização pelo Yahoo
>
>
>
>
>  
>


Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico flavio_brune...@yahoo.com [oracle_br]
Olha o que achei... para todos os gostos, vale como estudo. 

 ORACLE-BASE - String Aggregation Techniques 
http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php 
 
 http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php 
 
 ORACLE-BASE - String Aggregation Techniques 
http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php 
ORACLE-BASE - String Aggregation Techniques
 
 
 
 Visualizar em www.oracle-bas... 
http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php 
 Visualização pelo Yahoo 
 
 
  


 



Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico Vitor Junior vitorj...@gmail.com [oracle_br]
O Thiagão ainda comentou:
[14:00:14] Thiago dos santos leite: acho que no 10g tem um WM_CONCAT e
STRAGG, só tem que testar.



Att,/Regards,


Vitor Jr.
Infraestrutura / Infrastructure Team
Oracle 11g DBA Certified Professional - OCP
Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid
Infrastructure Administrator - OCE
Oracle Database 11g Performance Tuning Certified Expert - OCE
Oracle Exadata 11g Certified Implementation Specialist
Oracle Certified Associate, MySQL 5
mail, gtalk e msn: vitorj...@gmail.com
http://certificacaobd.com.br/
skype: vjunior1981
https://mybizcard.co/vitor.jr.385628


Em 28 de maio de 2014 14:39, flavio_brune...@yahoo.com [oracle_br] <
oracle_br@yahoogrupos.com.br> escreveu:

>
>
> Usando a dica do Thiago dos Santos Leite (colega do Vitor Junior), segue
> outra solução, que funcionou bem no Oracle 10. O exemplo do Thiago funciona
> no Oracle 11 em diante.
>
> select e.id, e.produto, e.situacao, wm_concat(s.descricao) lista
> from   estoque e
> join   situacao s on bitand(e.situacao, s.id) > 0
> group  by e.id, e.produto, e.situacao
> order  by e.id;
>
> Abs
>
>  
>


Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico flavio_brune...@yahoo.com [oracle_br]
Usando a dica do Thiago dos Santos Leite (colega do Vitor Junior), segue outra 
solução, que funcionou bem no Oracle 10. O exemplo do Thiago funciona no Oracle 
11 em diante. 

 select e.id, e.produto, e.situacao, wm_concat(s.descricao) lista
 from   estoque e
 join   situacao s on bitand(e.situacao, s.id) > 0
 group  by e.id, e.produto, e.situacao
 order  by e.id;
 

 Abs

 



Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
O Thiago usou exatamente a função BITAND, que o André já tinha dado a dica
em um e-mail anterior!

Ótima solução, código limpo e bem curto!




Em 28 de maio de 2014 14:02, Vitor Junior vitorj...@gmail.com [oracle_br] <
oracle_br@yahoogrupos.com.br> escreveu:

>
>
> Dica do colega Thiago dos Santos Leite, aqui da empresa. Segundo o Milton
> funcionou e simplificou:
>
>   1  select distinct e.id, e.produto, e.situacao, LISTAGG(s.descricao, '
> | ') WITHIN GROUP (order by s.id) over (partition by e.id) lista
>   2 from   estoque e
>   3 join   situacao s on bitand(e.situacao,
> s.id) > 0
>   4* order by e.id
> 13:56:16 dsv11g>/
>
> ID PRODUTO
>SITUACAO
> --
> 
> --
>  LISTA
>
> 
>  1 Cerveja
>   2
> Produto bloqueado manualmente
>
>  2 Picanha
>   5
> Produto vencido | Produto bloqueado para inventário
>
>  3 Alcatra
>   9
> Produto vencido | Produto bloqueado por avaria
>
>  4 Maminha
>   7
> Produto vencido | Produto bloqueado manualmente | Produto bloqueado para
> inventário
>
>
> 4 linhas selecionadas.
>
>
>
> Att,/Regards,
>
>
> Vitor Jr.
> Infraestrutura / Infrastructure Team
> Oracle 11g DBA Certified Professional - OCP
> Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid
> Infrastructure Administrator - OCE
> Oracle Database 11g Performance Tuning Certified Expert - OCE
> Oracle Exadata 11g Certified Implementation Specialist
> Oracle Certified Associate, MySQL 5
> mail, gtalk e msn: vitorj...@gmail.com
> http://certificacaobd.com.br/
> skype: vjunior1981
> https://mybizcard.co/vitor.jr.385628
>
>
> Em 28 de maio de 2014 11:02, flavio_brune...@yahoo.com [oracle_br] <
> oracle_br@yahoogrupos.com.br> escreveu:
>
>
>>
>> Legal, que bom que gostou.
>> Particularmente eu utilizaria a solução com função por ser mais simples e
>> de fácil  manutenção. Mas, sempre é bom ter uma outra forma na manga.
>> Abraços
>>
>>
>  
>


Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico Vitor Junior vitorj...@gmail.com [oracle_br]
Dica do colega Thiago dos Santos Leite, aqui da empresa. Segundo o Milton
funcionou e simplificou:

  1  select distinct e.id, e.produto, e.situacao, LISTAGG(s.descricao, ' |
') WITHIN GROUP (order by s.id) over (partition by e.id) lista
  2 from   estoque e
  3 join   situacao s on bitand(e.situacao, s.id)
> 0
  4* order by e.id
13:56:16 dsv11g>/

ID PRODUTO
   SITUACAO
--

--
LISTA

 1 Cerveja
  2
Produto bloqueado manualmente

 2 Picanha
  5
Produto vencido | Produto bloqueado para inventário

 3 Alcatra
  9
Produto vencido | Produto bloqueado por avaria

 4 Maminha
  7
Produto vencido | Produto bloqueado manualmente | Produto bloqueado para
inventário


4 linhas selecionadas.



Att,/Regards,


Vitor Jr.
Infraestrutura / Infrastructure Team
Oracle 11g DBA Certified Professional - OCP
Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid
Infrastructure Administrator - OCE
Oracle Database 11g Performance Tuning Certified Expert - OCE
Oracle Exadata 11g Certified Implementation Specialist
Oracle Certified Associate, MySQL 5
mail, gtalk e msn: vitorj...@gmail.com
http://certificacaobd.com.br/
skype: vjunior1981
https://mybizcard.co/vitor.jr.385628


Em 28 de maio de 2014 11:02, flavio_brune...@yahoo.com [oracle_br] <
oracle_br@yahoogrupos.com.br> escreveu:

>
>
> Legal, que bom que gostou.
> Particularmente eu utilizaria a solução com função por ser mais simples e
> de fácil  manutenção. Mas, sempre é bom ter uma outra forma na manga.
> Abraços
>
>  
>


Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico flavio_brune...@yahoo.com [oracle_br]
Legal, que bom que gostou. Particularmente eu utilizaria a solução com função 
por ser mais simples e de fácil  manutenção. Mas, sempre é bom ter uma outra 
forma na manga.
 Abraços


Re: [oracle_br] Re: Desafio SQL

2014-05-28 Por tôpico 'Milton Bastos Henriquis Jr.' miltonbas...@gmail.com [oracle_br]
Flavio, SENSACIONAL cara!

Eu imaginava que nem fosse possível fazer isso apenas com SELECT, mas você
arrebentou na função analítica, parabéns!

Mandou bem demais!

Vou levar um bom tempo pra conseguir entender teu código, mas o fato é que
realmente funcionou.


Obrigado!


2014-05-27 19:15 GMT-03:00 flavio_brune...@yahoo.com [oracle_br] <
oracle_br@yahoogrupos.com.br>:

>
>
> Pessoal
>
> De qualquer forma, segue duas soluçõezinhas que poderiam ser utilizadas
> para resolver o problema, uma utilizando função e outra somente com SELECT.
> A segunda é mais complexa porém resolve caso não seja possível criar uma
> function (por motivos de grant mesmo).
>
> Criação das tabelas:
> drop table situacao;
> create table situacao
> (
>idnumber(10)   constraint pk_situacao primary key,
>descricao varchar2(50) not null
> );
>
> drop table estoque;
> create table estoque
> (
>id   number(10)constraint pk_estoque primary key,
>produto  varchar2(100) not null,
>situacao number(10)not null
> );
>
> insert into situacao (id,descricao) values (1,'Produto vencido');
> insert into situacao (id,descricao) values (2,'Produto bloqueado
> manualmente');
> insert into situacao (id,descricao) values (4,'Produto bloqueado para
> inventário');
> insert into situacao (id,descricao) values (8,'Produto bloqueado por
> avaria');
>
> insert into estoque (id,produto,situacao) values (1,'Cerveja',2);
> insert into estoque (id,produto,situacao) values (2,'Picanha',5);
> insert into estoque (id,produto,situacao) values (3,'Alcatra',9);
> insert into estoque (id,produto,situacao) values (4,'Maminha',7);
>
> commit;
>
> Solução 1: Com Function
> create or replace function traz_situacao (psituacao in number) return
> varchar2 is
>vret varchar2(2000);
> begin
>for r in (select s.descricao from situacao s where bitand(s.id,psituacao)
> > 0 order by s.id) loop
>   vret := vret || r.descricao || '|';
>end loop;
>if length(vret) > 1 then
>   vret := substr(vret,1,length(vret)-1);
>end if;
>return vret;
> end;
> /
>
> select e.id, e.produto, e.situacao, traz_situacao(e.situacao)
> todas_situacoes
> from   estoque e;
>
>
> Solução 2: Sem Function
> select v3.id, v3.produto, v3.situacao, substr(v3.todas_situacoes,2)
> todas_situacoes
> from   (
>  select v2.id, v2.produto, v2.situacao, v2.todas_situacoes, v2.lv,
> max(v2.lv) over (partition by v2.id) max_lv
>  from   (
>   select v1.id, v1.produto, v1.situacao,
>  sys_connect_by_path(v1.descricao, '|')
> todas_situacoes,
>  level lv
>   from   (
>select e.id, e.produto, e.situacao,
> s.descricao, rownum rn,
>   lead(rownum) over (partition by e.idorder by
> s.id) lead_rn
>from   estoque e
>join   situacao s on bitand(e.situacao, s.id)
> > 0
>  ) v1
>   connect by prior v1.lead_rn = v1.rn
> ) v2
>) v3
> where  v3.lv = v3.max_lv;
>
> Abraços
>
>
>
>
>  
>


[oracle_br] Re: Desafio SQL

2014-05-27 Por tôpico flavio_brune...@yahoo.com [oracle_br]
Pessoal 

 De qualquer forma, segue duas soluçõezinhas que poderiam ser utilizadas para 
resolver o problema, uma utilizando função e outra somente com SELECT. A 
segunda é mais complexa porém resolve caso não seja possível criar uma function 
(por motivos de grant mesmo).
 

 Criação das tabelas:
 drop table situacao;
 create table situacao
 (
idnumber(10)   constraint pk_situacao primary key,
descricao varchar2(50) not null
 );
 

 drop table estoque;
 create table estoque
 (
id   number(10)constraint pk_estoque primary key,
produto  varchar2(100) not null,
situacao number(10)not null
 );
 

 insert into situacao (id,descricao) values (1,'Produto vencido');
 insert into situacao (id,descricao) values (2,'Produto bloqueado manualmente');
 insert into situacao (id,descricao) values (4,'Produto bloqueado para 
inventário');
 insert into situacao (id,descricao) values (8,'Produto bloqueado por avaria');
 

 insert into estoque (id,produto,situacao) values (1,'Cerveja',2);
 insert into estoque (id,produto,situacao) values (2,'Picanha',5);
 insert into estoque (id,produto,situacao) values (3,'Alcatra',9);
 insert into estoque (id,produto,situacao) values (4,'Maminha',7);
 

 commit;
 

 Solução 1: Com Function
 create or replace function traz_situacao (psituacao in number) return varchar2 
is
vret varchar2(2000);
 begin
for r in (select s.descricao from situacao s where bitand(s.id,psituacao) > 
0 order by s.id) loop
   vret := vret || r.descricao || '|';
end loop;
if length(vret) > 1 then
   vret := substr(vret,1,length(vret)-1);
end if;
return vret;
 end;
 /
 

 select e.id, e.produto, e.situacao, traz_situacao(e.situacao) todas_situacoes
 from   estoque e;
 

 

 Solução 2: Sem Function
 select v3.id, v3.produto, v3.situacao, substr(v3.todas_situacoes,2) 
todas_situacoes
 from   (
  select v2.id, v2.produto, v2.situacao, v2.todas_situacoes, v2.lv,
 max(v2.lv) over (partition by v2.id) max_lv
  from   (
   select v1.id, v1.produto, v1.situacao,
  sys_connect_by_path(v1.descricao, '|') 
todas_situacoes,
  level lv
   from   (
select e.id, e.produto, e.situacao, s.descricao, 
rownum rn,
   lead(rownum) over (partition by e.id order 
by s.id) lead_rn
from   estoque e
join   situacao s on bitand(e.situacao, s.id) > 0
  ) v1
   connect by prior v1.lead_rn = v1.rn
 ) v2
) v3
 where  v3.lv = v3.max_lv;
 


 Abraços