Usuário com melhor resposta
Subconsulta trazendo 3 meses anteriores de data informada em parâmetro

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
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 7 de junho de 2017 16:58
- Marcado como Resposta Guilherme Macedo S segunda-feira, 12 de junho de 2017 16:20
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
-
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?
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 7 de junho de 2017 16:58
- Marcado como Resposta Guilherme Macedo S segunda-feira, 12 de junho de 2017 16:20
-
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.