none
Subconsulta trazendo 3 meses anteriores de data informada em parâmetro RRS feed

  • Pergunta

  • Olá pessoal,

    Preciso fazer uma subquery onde me venha o resultado de um somatório baseado em três meses de uma data informada em um parâmetro. Tentei fazer o esquema abaixo mas me retornou o seguinte erro: 

    Msg 156, Level 15, State 1, Line 33
    Incorrect syntax near the keyword 'FROM'.

    Segue a consulta:

    DECLARE @pData1 AS DATETIME;
    DECLARE @pData2 AS DATETIME;
    
    SET @pData1 = '2017/03/01';
    SET @pData2 = '2017/03/31';
    
    
    
    SELECT COD_PRODUTO, DATA_INICIAL = @pData1, DATA_FINAL = @pData2,
    COD_CLASSIFICACAO, PRODUTO, LOCAL_ESTOQUE, SALDO_GERAL_FISICO,
    CONS_MENS_FISICO = ROUND((QUANTIDADE / 3), 0),
    EST_MIN_FISICO = ROUND(((QUANTIDADE / 3) / 2), 0),
    RESSUP_FISICO = ROUND((((QUANTIDADE / 3) + ((QUANTIDADE / 3) / 2)) - SALDO_GERAL_FISICO), 0)
    
    FROM (
    
    SELECT COD_PRODUTO = A.IDPRD, COD_CLASSIFICACAO = A.CODTB1FAT,
    PRODUTO = (A.CODIGOPRD + ' - ' + A.NOMEFANTASIA),
    LOCAL_ESTOQUE = (G.CODLOC + ' - ' + G.NOME),
    
    SALDO_GERAL_FISICO = ROUND(A.SALDOGERALFISICO, 0),
    
    QUANTIDADE = ((SELECT SUM(X.QUANTIDADE)
                    FROM TITMMOV X (NOLOCK)
                    INNER JOIN TMOV Y (NOLOCK) ON (Y.CODCOLIGADA = X.CODCOLIGADA AND Y.IDMOV = X.IDMOV)
                    WHERE X.CODCOLIGADA = A.CODCOLIGADA
                    AND X.IDPRD = A.IDPRD
                    AND X.CODLOC = G.CODLOC
                    -- AND Y.DATAEMISSAO BETWEEN @pData1 AND @pData2)
                    AND Y.DATAEMISSAO >= (SELECT DATEADD(MONTH, -3, @pData1))
    )
    
    FROM TPRD A (NOLOCK)
    INNER JOIN TTB1 B (NOLOCK) ON (B.CODCOLIGADA = A.CODCOLIGADA AND B.CODTB1FAT = A.CODTB1FAT)
    INNER JOIN TITMMOV C (NOLOCK) ON (C.CODCOLIGADA = A.CODCOLIGADA AND C.IDPRD = A.IDPRD)
    INNER JOIN TMOV D (NOLOCK) ON (D.CODCOLIGADA = C.CODCOLIGADA AND D.IDMOV = C.IDMOV)
    INNER JOIN TLOC G (NOLOCK) ON (G.CODCOLIGADA = C.CODCOLIGADA AND G.CODFILIAL = C.CODFILIAL AND G.CODLOC = C.CODLOC)
    
    
    WHERE A.CODIGOPRD LIKE '1.04.%'
    AND A.INATIVO <> 1
    AND D.DATAEMISSAO BETWEEN @pData1 AND @pData2
    AND D.CODTMV = '1.1.02' /* SAÍDA DO ALMOXARIFADO
    AND G.CODLOC = '01' CÓDIGO DO LOCAL DE ESTOQUE */
    ) AS ABC
    
    GROUP BY COD_PRODUTO, COD_CLASSIFICACAO, PRODUTO, LOCAL_ESTOQUE, QUANTIDADE, SALDO_GERAL_FISICO
    
    ORDER BY LOCAL_ESTOQUE, PRODUTO
    

    Grato,

    Ilano

    segunda-feira, 5 de junho de 2017 20:06

Respostas

  • Acredito que o problema esteja nos parênteses como disse anteriormente.

    Existe uma diferença nos parênteses entre as 2 linhas que você destacou:

    -- AND Y.DATAEMISSAO BETWEEN @pData1 AND @pData2 )
    AND Y.DATAEMISSAO >= ( SELECT DATEADD (MONTH, -3, @pData1) )

    Repare que a linha que está comentada possui um fechamento de parênteses a mais no final que a linha de baixo não tem.

    Você também poderia adicionar um fechamento de parênteses no final da linha de baixo para formar o conjunto com uma daquelas aberturas de parênteses que destaquei, mas acho que seria melhor remover uma das aberturas de parênteses, acho que evita confusão. 

    obs: não tem relação com o erro mas esse Select antes da função DateAdd não é necessário, assim como os parênteses que estão envolta do mesmo

    Espero que ajude


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

    terça-feira, 6 de junho de 2017 13:08

Todas as Respostas

  • Boa tarde,

    Não sei se entendi corretamente, mas experimente remover uma das aberturas de parênteses que estão antes do Select na linha abaixo:

    QUANTIDADE = ((SELECT SUM(X.QUANTIDADE)

    ficando dessa forma:

    QUANTIDADE = (SELECT SUM(X.QUANTIDADE)

    Espero que ajude


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

    segunda-feira, 5 de junho de 2017 20:18
  • Desculpa, esqueci de informar onde está acontecendo o problema.

    Se você reparar, tem as duas linhas:

    -- AND Y.DATAEMISSAO BETWEEN @pData1 AND @pData2)
    AND Y.DATAEMISSAO >= (SELECT DATEADD(MONTH, -3, @pData1))

    Se eu comentar a segunda linha e descomentar a primeira, ele roda, mas quero pegar três meses pra trás a partir da data inicial, ou seja, da @pData1. É aí onde está o problema. E, se eu trocar @pData1 por GETDATE():

    -- AND Y.DATAEMISSAO BETWEEN @pData1 AND @pData2)
    AND Y.DATAEMISSAO >= (SELECT DATEADD(MONTH, -3, GETDATE()))

    Também ocasiona o mesmo erro. Você saberia o porque?

    terça-feira, 6 de junho de 2017 12:48
  • Acredito que o problema esteja nos parênteses como disse anteriormente.

    Existe uma diferença nos parênteses entre as 2 linhas que você destacou:

    -- AND Y.DATAEMISSAO BETWEEN @pData1 AND @pData2 )
    AND Y.DATAEMISSAO >= ( SELECT DATEADD (MONTH, -3, @pData1) )

    Repare que a linha que está comentada possui um fechamento de parênteses a mais no final que a linha de baixo não tem.

    Você também poderia adicionar um fechamento de parênteses no final da linha de baixo para formar o conjunto com uma daquelas aberturas de parênteses que destaquei, mas acho que seria melhor remover uma das aberturas de parênteses, acho que evita confusão. 

    obs: não tem relação com o erro mas esse Select antes da função DateAdd não é necessário, assim como os parênteses que estão envolta do mesmo

    Espero que ajude


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

    terça-feira, 6 de junho de 2017 13:08
  • Bom dia,

    Por falta de retorno esta thread esta encerrada !

    Por gentileza, caso necessário abra uma nova thread.

    Atenciosamente,


    Guilherme Macedo S

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 12 de junho de 2017 16:20