Somar select com union

11/07/2020

0

Prezados,

Estou com dificuldade com a função SUM em um select com UNION
SELECT
FORMAT(SUM(A.VALORTOTAL)/12, 'C', 'pt-br')  VALOR
FROM ft_armazenagem A  
INNER JOIN MS_PESSOA B ON (B.HANDLE = A.clientefaturamento)
AND A.DATAfechamento >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
AND A.TIPO NOT IN (2,3)
AND A.STATUS NOT IN (6)

UNION ALL

SELECT 
FORMAT(SUM(A.VALORTOTAL)/12, 'C', 'pt-br')  VALOR
FROM CO_CONTRATOFATURAMENTO A  
INNER JOIN MS_PESSOA B ON (B.HANDLE = A.PESSOA)
AND A.DATA >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
AND A.STATUS NOT IN (6)

Com esse código acima ele me traz os valores abaixo, gostaria de somar os valores, mas tenho dificuldade.
$274.814,13
R$22.547,67
Tentei fazer a soma da seguinte formar, mas ele retorna com erro. "O tipo de dados de operando nvarchar é inválido para o operador sum"
SELECT SUM(VALOR) MEDIA FROM
(SELECT
FORMAT(SUM(A.VALORTOTAL)/12, 'C', 'pt-br')  VALOR
FROM ft_armazenagem A  
INNER JOIN MS_PESSOA B ON (B.HANDLE = A.clientefaturamento)
AND A.DATAfechamento >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
AND A.TIPO NOT IN (2,3)
AND A.STATUS NOT IN (6)


UNION ALL


SELECT 
FORMAT(SUM(A.VALORTOTAL)/12, 'C', 'pt-br')  VALOR
FROM CO_CONTRATOFATURAMENTO A  
INNER JOIN MS_PESSOA B ON (B.HANDLE = A.PESSOA)
AND A.DATA >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
AND A.STATUS NOT IN (6)
)TAB

Alguém consegue me ajudar?
Isaque

Isaque

Responder

Post mais votado

13/07/2020

tente assim:
SELECT
	FORMAT(SUM(VLTOTAL), 'C', 'pt-br') VALOR -- SOMENTE aqui você formata como texto
FROM (
		SELECT
			(SUM(A.VALORTOTAL)/12) VLTOTAL -- aqui você NÃO formata como texto
		FROM
			ft_armazenagem A  
		INNER JOIN
			MS_PESSOA B ON (B.HANDLE = A.clientefaturamento)
			AND A.DATAfechamento >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
			AND A.TIPO NOT IN (2,3)
			AND A.STATUS NOT IN (6)

		UNION ALL

		SELECT
			(SUM(A.VALORTOTAL)/12) VLTOTAL -- aqui você NÃO formata como texto
		FROM
			CO_CONTRATOFATURAMENTO A  
		INNER JOIN
			MS_PESSOA B ON (B.HANDLE = A.PESSOA)
			AND A.DATA >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
			AND A.STATUS NOT IN (6)
) T


Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

11/07/2020

Jothaz

A forma mais fácil é criar uma tabela temporária com
SELECT INTO
e depois somar os campos.

Não tenho como testar agora, mas é algo assim:




SELECT * INTO mytmp FROM (
		SELECT
		A.VALORTOTAL  VALOR
		FROM ft_armazenagem A  
		INNER JOIN MS_PESSOA B ON (B.HANDLE = A.clientefaturamento)
		AND A.DATAfechamento >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
		AND A.TIPO NOT IN (2,3)
		AND A.STATUS NOT IN (6)
 
		UNION ALL
 
		SELECT
		A.VALORTOTAL VALOR
		FROM CO_CONTRATOFATURAMENTO A  
		INNER JOIN MS_PESSOA B ON (B.HANDLE = A.PESSOA)
		AND A.DATA >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
		AND A.STATUS NOT IN (6)
) as tmp


select FORMAT(SUM(VALOR)/12, 'C', 'pt-br')  VALOR from mytmp

drop table mytmp
Responder

13/07/2020

Isaque

tente assim:
SELECT
	FORMAT(SUM(VLTOTAL), 'C', 'pt-br') VALOR -- SOMENTE aqui você formata como texto
FROM (
		SELECT
			(SUM(A.VALORTOTAL)/12) VLTOTAL -- aqui você NÃO formata como texto
		FROM
			ft_armazenagem A  
		INNER JOIN
			MS_PESSOA B ON (B.HANDLE = A.clientefaturamento)
			AND A.DATAfechamento >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
			AND A.TIPO NOT IN (2,3)
			AND A.STATUS NOT IN (6)

		UNION ALL

		SELECT
			(SUM(A.VALORTOTAL)/12) VLTOTAL -- aqui você NÃO formata como texto
		FROM
			CO_CONTRATOFATURAMENTO A  
		INNER JOIN
			MS_PESSOA B ON (B.HANDLE = A.PESSOA)
			AND A.DATA >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) -11, 0)
			AND A.STATUS NOT IN (6)
) T


Obrigado, Funcionou perfeitamente.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar