- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 12 anos, 6 meses atrás por fsitja.
-
AutorPosts
-
30 de maio de 2012 às 7:13 pm #103711MiroParticipante
Bom dia, alguém pode me ajudar nesta consulta, gostaria que retorna-se apenas a linha com menor valor da coluna SEQCLA, mas a sub-consulta não esta funcionando….
select b.siscar, d.valsal, c.codest, C.SEQCLA,c.nivsal
from r034fun a, r024car b, r076niv c, r038hsa d
where a.estcar = b.estcar
and a.codcar = b.codcar
and b.siscar = c.sisniv
and a.numemp = d.numemp
and a.tipcol = d.tipcol
and a.numcad = d.numcad
and d.valsal = c.valsal
and c.datalt >= ‘01052012’
and d.datalt >= ‘01052012’
and (a.numemp = 1 and a.codfil = 1 or a.numemp in (2,18,20))
and a.tipcol = 1
and a.sitafa <> 7
and a.numcad = 2832
and a.numemp = 2AND C.SEQCLA = (SELECT MIN(TAB1.SEQCLA)
FROM R076NIV TAB1
WHERE TAB1.CODEST = C.CODEST
AND TAB1.TIPEST = C.TIPEST
AND TAB1.DATALT = C.DATALT
AND TAB1.SEQCLA = C.SEQCLA
AND TAB1.SEQNIV = C.SEQNIV)RESULTADO
SISCAR VALSAL CODEST SEQCLA NIVSAL
3 6,49 23 4 2
3 6,49 23 3 530 de maio de 2012 às 9:49 pm #103713fsitjaParticipanteDá uma olhada no SQL abaixo e vê se faz sentido o palpite que coloquei por favor:
SELECT MIN(b.siscar) KEEP (DENSE_RANK FIRST ORDER BY c.seqcla) siscar,
MIN(d.valsal) KEEP (DENSE_RANK FIRST ORDER BY c.seqcla) valsal,
c.codest,
MIN(c.seqcla) KEEP (DENSE_RANK FIRST ORDER BY c.seqcla) seqcla,
MIN(c.nivsal) KEEP (DENSE_RANK FIRST ORDER BY c.seqcla) nivsal
FROM r034fun a
JOIN r024car b ON a.estcar = b.estcar
AND a.codcar = b.codcar
JOIN r038hsa d ON a.numemp = d.numemp
AND a.tipcol = d.tipcol
AND a.numcad = d.numcad
JOIN r076niv c ON b.siscar = c.sisniv
AND d.valsal = c.valsal
WHERE c.datalt >= '01052012'
AND d.datalt >= '01052012'
--AND (a.numemp = 1 AND a.codfil = 1 OR a.numemp IN (2, 18, 20))
AND a.tipcol = 1
AND a.sitafa 7
AND a.numcad = 2832
AND a.numemp = 2
GROUP BY c.codest, c.tipest, c.datalt, c.seqniv
Não tenho dados para testar nem sei se funciona, mas tentei interpretar o código meio na intuição.A linha “AND (a.numemp = 1 AND a.codfil = 1 OR a.numemp IN (2, 18, 20))” eu comentei porque ela está contradizendo a última linha. Se numemp for igual a 2 ele nunca vai poder se igual a 18 ou 20, ou mesmo 1; SEMPRE será igual a 2. Tem que ver qual sua regra correta.
Tem outros exemplos de utilização dessa função de keep dense_rank first/last no link abaixo da documentação:
http://docs.oracle.com/cd/E11882_01/ser … #DWHSG8705Se não acertei bem o que você quer, veja se é possível postar dados de exemplo das tabelas que gerem aquele seu resultado desejado, e alguma explicaçãozinha breve das regras.
-
AutorPosts
- Você deve fazer login para responder a este tópico.