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 >>> >>> >> > >