Pular para o conteúdo
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #103711
    Avatar de MiroMiro
    Participante

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

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

      #103713
      Avatar de fsitjafsitja
      Participante

        Dá 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 … #DWHSG8705

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

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress