none
Usar campo de fora do LEFT JOIN ou OUTER APLLY no OFFSET ROWS FETCH NEXT RRS feed

  • Pergunta

  • Boa tarde, pessoal, estou com um problema que não estou conseguindo resolver, a consulta abaixo não roda pois quando eu faço um IIF no OFFSET ROWS FETCH NEXT ele não permite pois é um campo da tabela exterior a sub consulta, alguém pode me ajudar, segue código abaixo:

    DECLARE @PontoCorte INT;
    SET @PontoCorte = 100;
    
    SELECT CampoA, CampoB, ROUND(SUM(CampoC),2) AS CampoC
    FROM TabelaX x LEFT JOIN (SELECT TOP 10 CampoH,CampoI,CampoJ
    						FROM TabelaY
    						ORDER BY OFFSET 0 ROWS FETCH NEXT IIF(ROUND(SUM(x.CampoC),2) < @PontoCorte,1,10) ROWS ONLY
    						) y
    			  ON x.CampoA = y.CampoH
    GROUP BY CampoA, CampoB

    A mensagem que aparece quando eu tenho rodar esse contexto de códito é: The multi-part identifier "x.CampoC" could not be bound.

    AJUDA AI GALERA! OQUE EU FAÇO!

    quinta-feira, 5 de julho de 2018 18:02

Respostas

Todas as Respostas

  • Fala Gabriel, blz?

    Assim, o que você está tentando fazer ali está meio estranho, não to vendo muito sentido pra falar a verdade, mas nos diga, qual o seu objetivo nessa consulta.


    Se a resposta foi útil por favor qualifique! Janderson Candido de Mattos - MCPD

    quinta-feira, 5 de julho de 2018 18:49
  • Então Janderson, é o seguinte, o FETCH NEXT serve para validar a quantidade de materiais que irão receber o valor rateado, porém não gostaria de ratear um valor muito baixo, ou seja, com a variavel @PontoCorte eu determino o valor mínimo, ou seja, se o valor da x.ColunaC for menor que 100 por exemplo, eu irei retornar apenas uma linha da subconsulta para realizar o left, caso o valor da coluna x.ColunaC for maior que 100 então vou retornar 10 linhas do left join. Pegou a jogada?

    quinta-feira, 5 de julho de 2018 18:55
  • Boa tarde,

    Não cheguei a fazer nenhum teste mas experimente dessa forma:

    DECLARE @PontoCorte INT;
    SET @PontoCorte = 100;
    
    WITH CTE_SUM as
    (
        SELECT CampoA, CampoB, ROUND(SUM(CampoC),2) AS CampoC
        FROM TabelaX x 
        GROUP BY CampoA, CampoB
    )
    
    SELECT *
    FROM CTE_SUM c
    OUTER APPLY
    (
        SELECT CampoH, CampoI, CampoJ
        FROM TabelaY y
        WHERE
            y.CampoH = c.CampoA
        ORDER BY 
            OFFSET 0 ROWS 
            FETCH NEXT (IIF(c.CampoC < @PontoCorte, 1, 10)) ROWS ONLY
    ) y

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br


    quinta-feira, 5 de julho de 2018 19:30
  • Eai gapimex, tentei como você disse, e mesmo assim continuo com o mesmo problema, o erro de retorno dessa vez foi: Msg 4101, Level 15, State 1, Line 56
    Aggregates on the right side of an APPLY cannot reference columns from the left side.
    quinta-feira, 5 de julho de 2018 19:35
  • Como está a sua query?

    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 5 de julho de 2018 19:51
  • Então, não posso colocar aqui por motivos corporativos, mas está com o mesmo contexto da que você mencionou acima
    quinta-feira, 5 de julho de 2018 19:54
  • Fala gapimex, funcionou cara, você fez muito bem, colocou a soma na CTE, tinha feito o mesmo porem lá no IFF eu não tinha tirado o SUM(), por isso estava dando pau, parabéns e muito obrigado.

    quinta-feira, 5 de julho de 2018 20:05