none
Sub Query RRS feed

  • 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

    quarta-feira, 23 de março de 2016 12:37

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
    quinta-feira, 24 de março de 2016 12:23
  • 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
    quinta-feira, 24 de março de 2016 16:22

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
    quinta-feira, 24 de março de 2016 12:23
  • 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

    quinta-feira, 24 de março de 2016 12:53
  • 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
    quinta-feira, 24 de março de 2016 13:31
  • 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), 

    quinta-feira, 24 de março de 2016 14:08
  • 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
    quinta-feira, 24 de março de 2016 16:22
  • Retorna a mensagem:

    Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

    quinta-feira, 24 de março de 2016 17:16
  • Boa tarde,

    Roberto!

    Pode dar uma ajuda, estou quebrando a cabeça com essa query, 

    abs,

    Leandro Massena

    segunda-feira, 28 de março de 2016 14:37