Usuário com melhor resposta
Sub Query

Pergunta
-
Bom dia,
Galera!
Preciso de uma ajuda em uma consulta, vou descrever o que preciso, tenho essa query que retorna o valor e a quantidade de pedidos mês a mês ex. Janeiro, fevereiro, etc, além de trazer o resulto em quantidades mês a Mês ela traz o valor de custo da ultima movimentação de compra, até ai tudo certo porém preciso que traga o valor de custo da ultima movimentação de cada mês, exemplo:
Qtd. Janeiro , Custo Janeiro - Qtd. Fevereito, Custo Fevereiro 6.63
20 6.63 10 7,00
Não sei se é possível desta forma, se alguém puder ajudar pois já quebrei a cabeça.
Obrigado
With CTE_RN as ( SELECT IM.TipoLancCod, M.MovEstqDataEmissao As DataMovimento, Im.ProdCodEstr As Codigo, IM.ItMovEstqProdNome As 'Descrição', IM.ItMovEstqUnidMedCod As UnidMed, 'Janeiro' = ISNULL((SELECT ISNULL(SUM(IME.ITMOVESTQQTDPROD),0) FROM ITEM_MOV_ESTQ IME JOIN MOV_ESTQ ME ON ME.MOVESTQCHV = IME.MOVESTQCHV LEFT JOIN TIPO_LANC TL ON TL.TIPOLANCCOD = IME.TIPOLANCCOD WHERE IME.ITMOVESTQDATAMOVIMENTO = ME.MOVESTQDATAMOVIMENTO AND ME.TIPOLANCCOD = IME.TIPOLANCCOD AND IME.ITMOVESTQDATAMOVIMENTO >= '20160101' AND IME.ITMOVESTQDATAMOVIMENTO <= '20160323' AND P.PRODCODESTR = IME.PRODCODESTR AND TL.TipoLancNormTransf = 'Compra' AND Month(IME.ITMOVESTQDATAMOVIMENTO) = 01),0), Case When IM.ProdCodEstr IN ('13.08.0005','23.08.0459','23.08.0458','13.05.0064') And IM.TipoLancCod = 'E0000309' Then CONVERT(NUMERIC(14,2), (((IM.ItMovEstqValProd*1/100)+ IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd)) When IM.TipoLancCod = 'E0000309'Then CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd)) Else (CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd - IM.ItMovEstqValIcms - IM.ItMovEstqValPis - IM.ItMovEstqValCofins) /NullIF (IM.ItMovEstqQtdProd,0)))) End AS ValorCusto_Janeiro, 'Fevereiro' = ISNULL((SELECT ISNULL(SUM(IME.ITMOVESTQQTDPROD),0) FROM ITEM_MOV_ESTQ IME JOIN MOV_ESTQ ME ON ME.MOVESTQCHV = IME.MOVESTQCHV LEFT JOIN TIPO_LANC TL ON TL.TIPOLANCCOD = IME.TIPOLANCCOD WHERE IME.ITMOVESTQDATAMOVIMENTO = ME.MOVESTQDATAMOVIMENTO AND ME.TIPOLANCCOD = IME.TIPOLANCCOD AND IME.ITMOVESTQDATAMOVIMENTO >= '20160101' AND IME.ITMOVESTQDATAMOVIMENTO <= '20160323' AND P.PRODCODESTR = IME.PRODCODESTR AND TL.TipoLancNormTransf = 'Compra' AND Month(IME.ITMOVESTQDATAMOVIMENTO) = 02),0), Case When IM.ProdCodEstr IN ('13.08.0005','23.08.0459','23.08.0458','13.05.0064') And IM.TipoLancCod = 'E0000309' Then CONVERT(NUMERIC(14,2), (((IM.ItMovEstqValProd*1/100)+ IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd)) When IM.TipoLancCod = 'E0000309'Then CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd)) Else (CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd - IM.ItMovEstqValIcms - IM.ItMovEstqValPis - IM.ItMovEstqValCofins) /NullIF (IM.ItMovEstqQtdProd,0)))) End AS ValorCusto_Fevereiro, ROW_NUMBER() OVER(PARTITION BY IM.EmpCod, IM.ProdCodEstr ORDER BY M.MovEstqDataEmissao DESC) as RN FROM MOV_ESTQ M WITH(NOLOCK), ITEM_MOV_ESTQ IM WITH(NOLOCK), TIPO_LANC TL WITH(NOLOCK), Produto P WITH(NOLOCK) WHERE TL.TipoLancNormTransf = 'Compra' AND M.MovEstqDataEmissao <= '20160323' AND IM.ProdCodEstr >= '12.01.0001' AND IM.ProdCodEstr <= '13.99.9999' AND M.EmpCod = IM.EmpCod AND M.MovEstqChv = IM.MovEstqChv AND IM.TipoLancCod = TL.TipoLancCod And P.ProdCodEstr = IM.ProdCodEstr And P.ProdStat = 'Ativado' And IM.TipoLancCod Not In ('E0000759','E0000701','E0000702','E0000057','E0000475','E0000311','E0000216','E0000792') And Im.ItMovEstqUnidMedPos = '1' ) Select * from CTE_RN where RN = 1 Order By 3, 2
Respostas
-
Bom dia Leandro,
Você vai precisar fazer da seguinte maneira:
select Max(id), valorDeCusto from suatabela where date between "inicio" and "final" group by idprojeto
Att., Roberto Alves
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.- Marcado como Resposta Marcos SJ quinta-feira, 24 de março de 2016 12:34
-
Só criar um group by para TEM_MOV_ESTQ.ProdCodEstr
Att., Roberto Alves
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.- Marcado como Resposta Marcos SJ segunda-feira, 28 de março de 2016 15:09
Todas as Respostas
-
Bom dia Leandro,
Você vai precisar fazer da seguinte maneira:
select Max(id), valorDeCusto from suatabela where date between "inicio" and "final" group by idprojeto
Att., Roberto Alves
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.- Marcado como Resposta Marcos SJ quinta-feira, 24 de março de 2016 12:34
-
Bom dia,
Roberto!
Você pode dar um exemplo, pois preciso que traga o valor de custo da ultima data de cada período, exemplo: no sub select de janeiro a ultima movimentação, no sub de fevereiro a ultima movimentação e assim por diante, sempre passando o período como parâmetro.
abs,
Leandro Massena
-
Leandro,
Você leu o exemplo acima?
É exatamente isso, você pega pelo max ID o ultimo registro baseado em data. Sem corpo mole, você consegue adaptar o código acima em sua query.
Att., Roberto Alves
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.- Editado Marcos SJ quinta-feira, 24 de março de 2016 13:32 Edição
-
Roberto!
Desculpe mas não consegui entender como fazer a adaptação pois colocando dentro do sub- select retornar erro, fiz da seguinte forma:
mensagem de erro:
Mensagem 8120, Nível 16, Estado 1, Linha 33
Column 'ITEM_MOV_ESTQ.ProdCodEstr' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
'Fevereiro' = ISNULL((SELECT ISNULL(SUM(IME.ITMOVESTQQTDPROD),0)
FROM ITEM_MOV_ESTQ IME
JOIN MOV_ESTQ ME ON ME.MOVESTQCHV = IME.MOVESTQCHV
LEFT JOIN TIPO_LANC TL ON TL.TIPOLANCCOD = IME.TIPOLANCCOD
WHERE IME.ITMOVESTQDATAMOVIMENTO = ME.MOVESTQDATAMOVIMENTO
AND ME.TIPOLANCCOD = IME.TIPOLANCCOD
AND IME.ITMOVESTQDATAMOVIMENTO >= '20160101'
AND IME.ITMOVESTQDATAMOVIMENTO <= '20160323'
AND P.PRODCODESTR = IME.PRODCODESTR
AND TL.TipoLancNormTransf = 'Compra'
AND Month(IME.ITMOVESTQDATAMOVIMENTO) = 02),0),
ValorCusto_Fevereiro =(Select MAX(IM.ITMOVESTQDATAMOVIMENTO), Case When IM.ProdCodEstr IN ('13.08.0005','23.08.0459','23.08.0458','13.05.0064') And IM.TipoLancCod = 'E0000309' Then
CONVERT(NUMERIC(14,2), (((IM.ItMovEstqValProd*1/100)+ IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd))
When IM.TipoLancCod = 'E0000309'Then
CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd + IM.ItMovEstqValII + IM.ItMovEstqValSiscomex) / IM.ItMovEstqQtdProd))
Else
(CONVERT(NUMERIC(14,2), ((IM.ItMovEstqValProd - IM.ItMovEstqValIcms - IM.ItMovEstqValPis - IM.ItMovEstqValCofins) /NullIF (IM.ItMovEstqQtdProd,0))))
End From ITEM_MOV_ESTQ IM where IM.ITMOVESTQDATAMOVIMENTO between '20160101' and '20160323' group by IM.ITMOVESTQDATAMOVIMENTO), -
Só criar um group by para TEM_MOV_ESTQ.ProdCodEstr
Att., Roberto Alves
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.- Marcado como Resposta Marcos SJ segunda-feira, 28 de março de 2016 15:09
-
-