none
Função SUM em subconsulta sql não funciona RRS feed

  • Pergunta

  • Boa tarde, tenho uma consulta no SQLSERVER, mas não consigo fazer funcionar a função SUM, pois o mesmo diz que não se pode efetuar uma soma em uma sub consulta, alguém poderia me ajudar a resolver esse problema ?

    SELECT TB_COMPOSTO.IDPRD,  

    SUM((SELECT TB_COMPOSTO.QUANTIDADE * PRECO1 FROM TPRD TB_PRODUTO1 WHERE TB_PRODUTO1.IDPRD = TB_COMPOSTO.IDPRDCOMPONENTE))
           
    FROM TPRDCOMPOSTO TB_COMPOSTO

    INNER JOIN TPRD TB_PRODUTO ON TB_COMPOSTO.IDPRD = TB_PRODUTO.IDPRD

    WHERE TB_COMPOSTO.IDPRD = 34822

    quinta-feira, 24 de maio de 2018 15:09

Respostas

  • Boa tarde, Juninhoprog!

    Realmente, não é possível utilizar uma função de agregação diretamente em uma subquery. Nesse caso você deverá adicionar um passo, como salvar o resultado original em uma tabela temporária para depois realizar a soma, utilizar mais uma subquery ou uma cte, como no exemplo abaixo:

    ;With Composto
    As
    (
    	SELECT TB_COMPOSTO.IDPRD,  
    	(SELECT TB_COMPOSTO.QUANTIDADE * PRECO1 FROM TPRD TB_PRODUTO1 WHERE TB_PRODUTO1.IDPRD = TB_COMPOSTO.IDPRDCOMPONENTE) Valor 
    	FROM TPRDCOMPOSTO TB_COMPOSTO
    	INNER JOIN TPRD TB_PRODUTO ON TB_COMPOSTO.IDPRD = TB_PRODUTO.IDPRD
    	WHERE TB_COMPOSTO.IDPRD = 34822 
    )
    Select	IDPRD
    		,Sum(Valor)
    From	Composto
    Group By IDPRD
     
    quinta-feira, 24 de maio de 2018 20:06

Todas as Respostas

  • Boa tarde, Juninhoprog!

    Realmente, não é possível utilizar uma função de agregação diretamente em uma subquery. Nesse caso você deverá adicionar um passo, como salvar o resultado original em uma tabela temporária para depois realizar a soma, utilizar mais uma subquery ou uma cte, como no exemplo abaixo:

    ;With Composto
    As
    (
    	SELECT TB_COMPOSTO.IDPRD,  
    	(SELECT TB_COMPOSTO.QUANTIDADE * PRECO1 FROM TPRD TB_PRODUTO1 WHERE TB_PRODUTO1.IDPRD = TB_COMPOSTO.IDPRDCOMPONENTE) Valor 
    	FROM TPRDCOMPOSTO TB_COMPOSTO
    	INNER JOIN TPRD TB_PRODUTO ON TB_COMPOSTO.IDPRD = TB_PRODUTO.IDPRD
    	WHERE TB_COMPOSTO.IDPRD = 34822 
    )
    Select	IDPRD
    		,Sum(Valor)
    From	Composto
    Group By IDPRD
     
    quinta-feira, 24 de maio de 2018 20:06
  • Acho que dessa forma também funciona:

    SELECT TB_COMPOSTO.IDPRD
    	,  (SELECT SUM(TB_COMPOSTO.QUANTIDADE * PRECO1) FROM TPRD TB_PRODUTO1 WHERE TB_PRODUTO1.IDPRD = TB_COMPOSTO.IDPRDCOMPONENTE)       
    FROM TPRDCOMPOSTO TB_COMPOSTO
    	INNER JOIN TPRD TB_PRODUTO 
    		ON TB_COMPOSTO.IDPRD = TB_PRODUTO.IDPRD
    WHERE TB_COMPOSTO.IDPRD = 34822 
    GROUP BY TB_COMPOSTO.IDPRD
    	,	TB_COMPOSTO.IDPRDCOMPONENTE

    quinta-feira, 24 de maio de 2018 23:06
  • Bom dia, obrigado pela resposta, mas infelizmente não funcionou,  deu o seguinte erro:

    "Msg 8124, Level 16, State 1, Line 1
    Multiple columns are specified in an aggregated expression containing an outer reference. If an expression being aggregated contains an outer reference, then that outer reference must be the only column referenced in the expression."

    sexta-feira, 25 de maio de 2018 12:30
  • Bom dia, muito obrigado pela resposta, funcionou PERFEITAMENTE, nossa nem sei como agradecer, mas já te explorando mais um pouquinho, coloquei o where pra filtrar os registros como um teste, quando tiro o where me apresenta todos os registros que tem produtos compostos, mas os demais registros dos produtos não aparecem, exemplo, tenho 34.000 PRODUTOS CADASTRADOS, desses 7.000 tem produtos compostos que fazem a soma e é somente eles que aparecem, como faço pra aparecerem todos os 34.000 PRODUTOS CADASTRADOS ?
    sexta-feira, 25 de maio de 2018 12:39
  • Olá, altere a ordem das tabelas no FROM e troque INNER JOIN por LEFT JOIN

    SELECT TB_PRODUTO.IDPRD
    	,  (SELECT SUM(TB_COMPOSTO.QUANTIDADE * PRECO1) FROM TPRD TB_PRODUTO1 WHERE TB_PRODUTO1.IDPRD = TB_PRODUTO.IDPRD)       
    FROM TPRD TB_PRODUTO 
    	LEFT JOIN TPRDCOMPOSTO TB_COMPOSTO
    		ON TB_PRODUTO.IDPRD = TB_COMPOSTO.IDPRD
    GROUP BY TB_PRODUTO.IDPRD


    sexta-feira, 25 de maio de 2018 20:17