none
Cálculos entre subquery RRS feed

  • Pergunta

  • Pesoal na query abaixo tenho algumas subquery as quias dou um alias para elas estou obtendo os resultados corretamente porem precisava fazer alguns calculos entre os resultados destas subqueryes sei que posos fazer usando as mesas subqueries mas preciso popupar linhas de código é possível?

    preciso fazer tipo assim:

    Tenho uma subquery que dei o alias dela de SOMAE e outra SOMAS preciso fazer tipo (SOMAE - SOMAS) * ESi.Qtde 'SALDO_ATUAL'

    Segue a query:

     

    ;WITH CTE AS 
    (
    	SELECT 
    		ROW_NUMBER() OVER (ORDER BY X.NF, X.DATA) as ID,
    		X.* 
    	FROM 
    	(
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			ESI.Qtde  AS Qtde, 
    			ESI.V_Unitario AS V_Unitario, 
    			ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Entrada_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')
    		UNION 
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			-ESI.Qtde  AS Qtde, 
    			-ESI.V_Unitario AS V_Unitario, 
    			-ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Saida_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND'2007-12-31 00:00:00')
    	) AS X
    )
    
    
    SELECT 
    	*,
    	--SOMA qtd de entadas no periodo
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')
    			) AS SOMAE,
    			--Total entradas no estoque
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')) AS SOMAET,
    			
    			--SOMA SAIDAS no Periodo
    			(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')
    			) AS SOMAS, 
    			
    			--- Total de SAIDAS no estoque
    				(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322')AND 
    			(ESI.Cod_Empresa = '1')) AS SOMAST,
    			--Quantidade de saidas antés do periodo
    			(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada < '2007-07-31 00:00:00')
    			) AS SAP, 
    			-----
    			----ENTRADAS ANTES DO PERIODO
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND
    			(S.Dta_Entrada < '2007-07-31 00:00:00')
    			) AS EAP,
    			-----
    			---- pReciso fazer algo tipo (EAP - SAp_ * ESI.Qtde 'SALDO'
    	    ValorAcumulado = (SELECT SUM(V_Total) FROM CTE WHERE ID <= C.ID) 
    FROM 
    	CTE AS C
    
    
    

    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    terça-feira, 28 de dezembro de 2010 18:18

Respostas

  • Resolvi assim ficou com mais linhas mais deu certo:

    ;WITH CTE AS 
    (
    	SELECT 
    		ROW_NUMBER() OVER (ORDER BY X.NF, X.DATA) as ID,
    		X.* 
    	FROM 
    	(
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			ESI.Qtde  AS Qtde, 
    			ESI.V_Unitario AS V_Unitario, 
    			ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Entrada_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')
    		UNION 
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			-ESI.Qtde  AS Qtde, 
    			 ESI.V_Unitario AS V_Unitario, 
    			-ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Saida_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND'2007-12-31 00:00:00')
    	) AS X
    )
    
    
    SELECT 
    	*,
    	--SOMA qtd de entadas no periodo
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')) AS V_SE,
    			--Total entradas no estoque
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00'))*(V_Unitario) AS V_SEV,
    			--SOMA SAIDAS no Periodo
    			(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')) AS V_SS, 
    			--- Total de SAIDAS no estoque
    				(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    				dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    				WHERE (ESI.Cod_Estoque = '01') AND 
    				(ESI.Cod_Produto = '00322') AND 
    				(ESI.Cod_Empresa = '1') AND 
    				(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00'))*(V_Unitario) AS V_SSV,
    			----ENTRADAS ANTES DO PERIODO
    			((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 	
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada < '2007-07-31 00:00:00')) 
    			- (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada < '2007-07-31 00:00:00'))) AS V_DQ,
    			---- Disponivel no estroque antes do periodo
    			((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    				(ESI.Cod_Produto = '00322') AND 
    				(ESI.Cod_Empresa = '1')AND 
    				(S.Dta_Entrada < '2007-07-31 00:00:00')) - (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    				 dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    				 WHERE (ESI.Cod_Estoque = '01') AND
    				 (ESI.Cod_Produto = '00322') AND
    				  (ESI.Cod_Empresa = '1') AND 
    				  (S.Dta_Entrada < '2007-07-31 00:00:00')))*(V_Unitario) AS V_DV,
    			-----
    	    V_Acum = (SELECT SUM(V_Total) FROM CTE WHERE ID <= C.ID) 
    FROM 
    	CTE AS C
    
    
    

    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    quarta-feira, 29 de dezembro de 2010 15:44

Todas as Respostas

  • Moizes,

    O que você esta querendo fazer, armazenar estes resultados em alguma table?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    terça-feira, 28 de dezembro de 2010 18:21
  • Já trago os resultados corretamente que preciso, é pegar os valores que fiz e poder fazer caluclos entre eles yipo aasim:

    select Descricao, Qtde, NF, Cod_Estoque, Cod_Produto, Cod_Empresa, Data, V_Unitario, V_Total,
     SOMAE, SOMAS, SOMAE-SOMAS 'SOMAES', SOMAE * V_Unitario 'QTE', SOMAS * -V_Unitario 'QtS', SOMAET, SOMAST, SOMAET-SOMAST 'QTES', (SOMAET - SOMAST)*(V_Unitario) 'VES'
    from
    (
    SELECT P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			ESI.Qtde  AS Qtde, 
    			ESI.V_Unitario AS V_Unitario, 
    			ESI.V_Total  AS V_Total,
    			--SOMA qtd de entadas no periodo
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2010-12-31 00:00:00')
    			) AS SOMAE,
    			--Total entradas no estoque
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')) AS SOMAET,
    			
    			--SOMA SAIDAS no Periodo
    			(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2010-12-31 00:00:00')
    			) AS SOMAS,
    			--- Total de SAIDAS no estoque
    				(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322')AND 
    			(ESI.Cod_Empresa = '1')) AS SOMAST
    			
    		FROM 
    			dbo.Entrada_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    		 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2010-12-31 00:00:00')
    			
    						
    			)x
    				
    			
    
    

    Se vc observar na query da pergunta inical tenho um union e não consigo fazer como esta query se vc observar tenho alguns calculos :

    SOMAE-SOMAS 'SOMAES', SOMAE * V_Unitario 'QTE', SOMAS * -V_Unitario 'QtS', SOMAET, SOMAST, SOMAET-SOMAST 'QTES', (SOMAET - SOMAST)*(V_Unitario) 'VES'
    
    

     É algo semelhante que preciso.


    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    terça-feira, 28 de dezembro de 2010 18:28
  • Moizés,

    Mas qual valores você se refere, seria os resultados dos cálculos para depois realizar outros cálculos?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quarta-feira, 29 de dezembro de 2010 00:04
  • Exato, repare que tenho algumas subquery que faço somas, tipo:

    ----ENTRADAS ANTES DO PERIODO
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    			WHERE
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND
    			(S.Dta_Entrada < '2007-07-31 00:00:00')
    			) AS EAP,
    			-----
    
    

     

    Ai por exemplo queria pegar o resultado desta e somar com o resultado de outra, tipo resultado de EAP + resultado de SAP.

    Ficou mais claro?


    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    quarta-feira, 29 de dezembro de 2010 00:09
  • Moizés,

    Cara entendi, então antes do Select você poderá realizar um Insert Into deste Select para uma table, ou então declarar variáveis e armazenar os valores nestas variáveis.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quarta-feira, 29 de dezembro de 2010 00:15
  • Moízes,

    Um detalhe importante a table ou variáveis devem ter a mesma estrutura dos dados que estão sendo processados na query.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    quarta-feira, 29 de dezembro de 2010 00:16
  • Tem algum exemplo? programção em SQL não é meu forte, estou criando um modulo num projeto em vb6 e por isso parti pros calculos direto no SQL, pois minha especialidade é .NET já fiz algo parecido mais foi num projeto em entity framework e LINQ e resolvi facilmente porem não tenho amplo dominio em SQL e VB por isso estou recorendo ao auxilio dos colegas com mais experiencia em SQL. Se pusder me mostrar um exemplo eu agradeço.

    Att.


    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    quarta-feira, 29 de dezembro de 2010 00:21
  • Resolvi assim ficou com mais linhas mais deu certo:

    ;WITH CTE AS 
    (
    	SELECT 
    		ROW_NUMBER() OVER (ORDER BY X.NF, X.DATA) as ID,
    		X.* 
    	FROM 
    	(
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			ESI.Qtde  AS Qtde, 
    			ESI.V_Unitario AS V_Unitario, 
    			ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Entrada_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')
    		UNION 
    		SELECT 
    			P.Descricao  AS Descricao, 
    			ESI.Id_Doc  AS NF, 
    			ESI.Cod_Estoque AS Cod_Estoque, 
    			ESI.Cod_Produto AS Cod_Produto, 
    			ESI.Cod_Empresa AS Cod_Empresa, 
    			S.Dta_Entrada AS Data, 
    			-ESI.Qtde  AS Qtde, 
    			 ESI.V_Unitario AS V_Unitario, 
    			-ESI.V_Total  AS V_Total
    		FROM  
    			dbo.Saida_Itens AS ESI INNER JOIN
    			dbo.Produtos AS P ON ESI.Cod_Empresa = P.Cod_Empresa AND ESI.Cod_Estoque = P.Cod_Estoque AND ESI.Cod_Produto = P.Cod_Produto INNER JOIN
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc
    		WHERE 
    			(ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND'2007-12-31 00:00:00')
    	) AS X
    )
    
    
    SELECT 
    	*,
    	--SOMA qtd de entadas no periodo
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')) AS V_SE,
    			--Total entradas no estoque
    			(SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00'))*(V_Unitario) AS V_SEV,
    			--SOMA SAIDAS no Periodo
    			(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00')) AS V_SS, 
    			--- Total de SAIDAS no estoque
    				(SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    				dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    				WHERE (ESI.Cod_Estoque = '01') AND 
    				(ESI.Cod_Produto = '00322') AND 
    				(ESI.Cod_Empresa = '1') AND 
    				(S.Dta_Entrada Between '2007-07-31 00:00:00' AND '2007-12-31 00:00:00'))*(V_Unitario) AS V_SSV,
    			----ENTRADAS ANTES DO PERIODO
    			((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 	
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1')AND 
    			(S.Dta_Entrada < '2007-07-31 00:00:00')) 
    			- (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    			(ESI.Cod_Produto = '00322') AND 
    			(ESI.Cod_Empresa = '1') AND 
    			(S.Dta_Entrada < '2007-07-31 00:00:00'))) AS V_DQ,
    			---- Disponivel no estroque antes do periodo
    			((SELECT SUM(ESI.Qtde) FROM Entrada_Itens AS ESI INNER JOIN 
    			dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    			WHERE (ESI.Cod_Estoque = '01') AND 
    				(ESI.Cod_Produto = '00322') AND 
    				(ESI.Cod_Empresa = '1')AND 
    				(S.Dta_Entrada < '2007-07-31 00:00:00')) - (SELECT SUM(ESI.Qtde) FROM Saida_Itens AS ESI INNER JOIN
    				 dbo.Saida AS S ON ESI.Cod_Empresa = S.Cod_Empresa AND ESI.Id_Doc = S.Id_Doc 
    				 WHERE (ESI.Cod_Estoque = '01') AND
    				 (ESI.Cod_Produto = '00322') AND
    				  (ESI.Cod_Empresa = '1') AND 
    				  (S.Dta_Entrada < '2007-07-31 00:00:00')))*(V_Unitario) AS V_DV,
    			-----
    	    V_Acum = (SELECT SUM(V_Total) FROM CTE WHERE ID <= C.ID) 
    FROM 
    	CTE AS C
    
    
    

    Moizés Cerqueira | MCP
    Site: www.moizes.cerqueira.nom.br
    Twitter: @moicer
    quarta-feira, 29 de dezembro de 2010 15:44
  • Moizés,

    Desculpe-me pela demora, que bom que você consegui resolver utilizando CTE.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
    sexta-feira, 31 de dezembro de 2010 00:33