Bom dia Srs.

Muito obrigado pelas dicas, vou trabalhar nisso essa semana e reporto
dúvidas no decorrer do trabalho.
Mais uma vez, obrigado.


At.te,
Eduardo Dornelles.


Em 15 de abril de 2016 11:42, Ricardo Tajiri rhtaj...@gmail.com [oracle_br]
<oracle_br@yahoogrupos.com.br> escreveu:

>
>
> Bom dia Eduardo.
>
> Normalmente gosto de brincar mais só com SQL's sem PL quando possível.
> Segue um exemplo do que pode ser feito com connect by e transformando tudo
> em números na mesma medida (mL) pra poder fazer os cálculos corretos. É
> mais uma opção de caminho pra resolução do seu problema, além das já
> sugeridas. Espero que te dê uma luz:
>
>
> *with tabela as ( -- massa de testes*
> *select 'Produto 1' nome,'500ml' volume,'descrição' descricao from dual
> union all*
> *select 'Produto 2','1L','descrição' from dual union all*
> *select 'Produto 3','2L','descrição' from dual union all*
> *select 'Produto 4','1,5L','descrição' from dual union all*
> *select 'Produto 5','1,8L','descrição' from dual*
> *),*
> *tabela2 as (-- para transformar os volumes de L em mL*
> *select nome,volume,descricao, *
> *to_number(regexp_replace(volume,'[a-Z]',''))*case when
> instr(volume,'ml')>0 then 1 else 1000 end vol  -- converte L em ML*
> *from tabela*
> *)*
> *,tabela3 as ( -- para criar as novas linhas*
> *select nome, level lvl, max(level) over (partition by nome) maxLevel *
> *from tabela2 *
> *connect by ceil((vol/500)) - level >= 0 and nome = nome*
> *group by nome, level*
> *order by nome, level)*
> *-- consulta retornando as linhas divididas*
> *select t2.nome, t2.volume volume_original, t2.descricao,case when t3.lvl
> = t3.maxLevel then vol-(t3.lvl-1)*500 else 500 end volume_quebrado*
> *from tabela3 t3*
> *join tabela2 t2 on t2.nome = t3.nome*
> *order by t2.nome, t3.lvl;*
>
>
> *Massa de testes:*
> NOME VOLUME DESCRICAO
> Produto 1 500ml descrição
> Produto 2 1L descrição
> Produto 3 2L descrição
> Produto 4 1,5L descrição
> Produto 5 1,8L descrição
>
> *Retorno:*
> NOME VOLUME_ORIGINAL DESCRICAO VOLUME_QUEBRADO
> Produto 1 500ml descrição 500
> Produto 2 1L descrição 500
> Produto 2 1L descrição 500
> Produto 3 2L descrição 500
> Produto 3 2L descrição 500
> Produto 3 2L descrição 500
> Produto 3 2L descrição 500
> Produto 4 1,5L descrição 500
> Produto 4 1,5L descrição 500
> Produto 4 1,5L descrição 500
> Produto 5 1,8L descrição 500
> Produto 5 1,8L descrição 500
> Produto 5 1,8L descrição 500
> Produto 5 1,8L descrição 300
>
>
> Att.
>
> Ricardo Hideyuki Tajiri
>
> Em 13 de abril de 2016 13:07, Fabio Prado fbifa...@gmail.com [oracle_br] <
> oracle_br@yahoogrupos.com.br> escreveu:
>
>>
>>
>> Eduardo, tente resolver o seu problema com PTF:
>> http://www.fabioprado.net/2010/12/pipelined-table-functions-funcao-para.html
>> .
>>
>> []s
>>
>> *Fábio Prado*
>> <http://www.fabioprado.net/2014/01/oracle-ace-o-que-e-isso.html>
>> www.fabioprado.net
>> "Compartilhando conhecimentos e treinando profissionais em Bancos de
>> Dados Oracle"
>>
>>
>> Em 13 de abril de 2016 10:07, Eduardo Dornelles eod.edua...@gmail.com
>> [oracle_br] <oracle_br@yahoogrupos.com.br> escreveu:
>>
>>>
>>>
>>> Bom dia.
>>>
>>> Preciso de uma solução para mostrar um registro mais de uma vez no
>>> retorno de um relatório, em uma situação específica.
>>>
>>> Na seguinte situação: Um produto quando solicitado em volume maior que
>>> 500ml, deve retornar uma linha para cada 500ml, exemplo:
>>>
>>>
>>>
>>> Produto 1        500ml             descrição
>>> Produto 2        1L                  descrição
>>> Produto 3        2L                  descrição
>>>
>>>
>>> Deve retornar o seguinte:
>>>
>>> produto 1         500ml             descrição
>>> produto 2         500ml             descrição
>>> produto 2         500ml             descrição
>>> produto 3         500ml             descrição
>>> produto 3         500ml             descrição
>>> produto 3         500ml             descrição
>>> produto 3         500ml             descrição
>>>
>>>
>>> Ou seja, preciso conseguir repetir uma linha uma ou mais vezes, em uma
>>> determinada condição.
>>>
>>> Alguém tem alguma ideia pra resolver isso?
>>> Muito obrigado.
>>>
>>>
>>> At.te,
>>> Eduardo Dornelles
>>>
>>>
>>
> 
>
  • ... Eduardo Dornelles eod.edua...@gmail.com [oracle_br]
    • ... Alessandro Lúcio Cordeiro da Silva alecordeirosi...@yahoo.com.br [oracle_br]
    • ... Fabio Prado fbifa...@gmail.com [oracle_br]
      • ... Ricardo Tajiri rhtaj...@gmail.com [oracle_br]
        • ... Eduardo Dornelles eod.edua...@gmail.com [oracle_br]

Responder a