Chiappa, Como sempre na mosca brother obrigado ... era exatamente isso que precisava ... obrigado a todos \o/
Em 23 de setembro de 2015 15:42, jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> escreveu: > > > Opa, então : Óbvio, o GROUP BY "comum" é CLARO que não serve, ele > transforma N linhas em uma só ("ensanduícha", "comprime", como eu dizia > pros meus alunos) e te dá UM valor-resultado, que pode ser a SOMA, a Média, > o MAX/MIN, absolutamente não é isso que vc quer, vc NÂO quer trabsformar as > N linhas numa só... > Aí, não sendo possível usar os comandos built-in da sua tool cliente e/ou > tool ou linguagem de programação (sqlplus, sql developer, toad e várias > outras possuem comandos nativos pra sua necessidade), tendo que ser em SQL > apenas então vc pode pesquisar que entre as funções básicas/escalares do > RDBMS Oracle que NENHUMA vai te ajudar : o fato é que vc quer uma lógica > que DEPENDA do valor exibido na linha anterior do resultset, pois vc só > quer exibir o valor de uma dada coluna-chave a primeira vez, e as funções > básicas só trabalham/enxergam o registro atual.... > SEMPRE que vc precisa de uma lógica que tenha que levar em conta o > registro anterior e/ou o próximo registro em SQL apenas no RDBMS Oracle > (sem lançar mão de PL/SQL), vc VAI TER que usar uma função analítica, se é > desejado trabalhar em SQL apenas.... > Exemplo : > > create table TB_TESTE( > coluna1 varchar2(5), > coluna2 number, > coluna3 number, > coluna4 number > ); > > insert into TB_TESTE values('XXXXX',1,15,200); > insert into TB_TESTE values('XXXXX',2,16,202); > insert into TB_TESTE values('XXXXX',3,13,205); > insert into TB_TESTE values('XXXXX',4,14,505); > insert into TB_TESTE values('YYYYY',1,25,300); > insert into TB_TESTE values('YYYYY',2,26,302); > > commit; > > select * from TB_TESTE; > > ==> eis o resultado : > > COLUNA1 COLUNA2 COLUNA3 COLUNA4 > ------- ---------- ---------- ---------- > XXXXX 1 15 200 > XXXXX 2 16 202 > XXXXX 3 13 205 > XXXXX 4 14 505 > YYYYY 1 25 300 > YYYYY 2 26 302 > > 6 linhas selecionadas > > O que eu preciso é "mostrar" pro sql se a ocorrência corrente do valor na > coluna1 é a primeira ou não, e se não for a primeira eu "oculto"/mostro um > NULL... LOGICAMENTE, a ROWNUM não serve porque ela mostra o número de linha > geral da query, a gente precisa mostrar o número de linha para o 'grupo' de > registros da chave XXXXX, depois zerar esse contador quando o valor > mudar.... Isso pode ser assim : > > select coluna1, coluna2, coluna3, coluna4, row_number() over (partition > by coluna1 order by coluna1) NUM from TB_TESTE; > > COLUNA1 COLUNA2 COLUNA3 COLUNA4 NUM > ------- ---------- ---------- ---------- ---------- > XXXXX 1 15 200 1 > XXXXX 2 16 202 2 > XXXXX 3 13 205 3 > XXXXX 4 14 505 4 > YYYYY 1 25 300 1 > YYYYY 2 26 302 2 > > 6 linhas selecionadas > > Tá vendo como agora sim fui capaz de dizer se é a primeira ocorrência ou > não do valor-chave ?? Fica ** trivial ** meter um CASE e perguntar isso : > > > SELECT CASE WHEN NUM=1 THEN COLUNA1 ELSE NULL END as COLUNA1, coluna2, > coluna3, coluna4 > FROM (select coluna1, coluna2, coluna3, coluna4, row_number() over > (partition by coluna1 order by coluna1) NUM from TB_TESTE) ; > > COLUNA1 COLUNA2 COLUNA3 COLUNA4 > ------- ---------- ---------- ---------- > XXXXX 1 15 200 > 2 16 202 > 3 13 205 > 4 14 505 > YYYYY 1 25 300 > 2 26 302 > > 6 linhas selecionadas > > []s > > Chiappa > >