Somar select com union

SQL Server

SQL

11/07/2020

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

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

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


GOSTEI 2

Mais Respostas

Jothaz

Jothaz

11/07/2020

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
GOSTEI 1
Isaque

Isaque

11/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


Obrigado, Funcionou perfeitamente.
GOSTEI 0
POSTAR