Usuário com melhor resposta
Função SUM em subconsulta sql não funciona

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
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 25 de maio de 2018 13:07
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 25 de maio de 2018 13:07
-
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 25 de maio de 2018 13:07
-
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."
-
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 ?
-
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