Sigo sin entender muchas cosas, aunque te puedo enfocar mucho más a la respuesta que necesitas.
Voy a crear una tabla con las columnas que se ven en las diferentes consultas. No es obligatorio que tengas los mismos tipos de datos, ni tan siquiera muchas filas, porque para el ejemplo creo que es claro.
Fase 1 creo el escenario:
Create table dbo.[Facturacion_Hispan_new]
( Pais varchar(3),
Mes datetime,
Modalidad varchar(10), -- desconocido
Segmento varchar(10), --desconocido
Cantidad float,
Monto float,
usd float,
[Tipo Documento] varchar(10),
Negocio varchar(10)
)
Insert into dbo.[Facturacion_Hispan_new]
( Pais, Mes, Modalidad, Segmento, Cantidad, Monto, usd, [Tipo Documento], Negocio)
values
('ARG', '20231201','MODALIDAD1', 'SEGMENTO1', 100.4, 200, 137, 'Factura', 'Movil'),
('CHI', '20230401','MODALIDAD1', 'SEGMENTO2', 150.7, 100, 175, 'Factura', 'Movil'),
('COL', '20230501','MODALIDAD1', 'SEGMENTO1', 220.3, 400, 199, 'Factura', 'Movil'),
('ARG', '20230701','MODALIDAD1', 'SEGMENTO1', 330.9, 500, 188, 'Factura', 'Movil');
Con la tabla creada y las filas insertadas (a modo de ejemplo). Voy a usar la misma estrategia de una tabla temporal, aunque es bastante probable que no fuera necesario.
Fase 2, una posible solución.
drop table if exists #temp;
SELECT [Pais],
CONVERT(VARCHAR(11), (MES), 103) AS Mes,
[Modalidad],
[Segmento],
CAST(Cantidad AS DECIMAL(18, 0)) AS Cantidad,
CAST(Monto AS DECIMAL(18, 0)) AS Monto,
CAST(usd AS DECIMAL(18, 0)) AS usd,
[Tipo documento],
[Negocio]
INTO #temp
FROM [dbo].[Facturacion_Hispan_new]
ORDER BY [Mes] ASC;
DECLARE @COLUMN NVARCHAR(MAX);
SELECT @COLUMN = ISNULL(@COLUMN + ',', '') + QUOTENAME(Mes)
FROM
(
SELECT DISTINCT
Mes
FROM #temp
) AS C;
Declare @columnsHeaders nvarchar(max)
SELECT @columnsHeaders = STUFF(
(
SELECT
/* Nota: La siguiente fila tiene que ir en una sola línea. */
', ' + 'IsNull('+QUOTENAME(LTRIM(mes))+',0) AS '+QUOTENAME(LTRIM(mes))
/* Fin de Nota */
FROM
(
select distinct mes
FROM #temp
) AS T
ORDER BY
mes
FOR XML PATH('')
), 1, 1, '');
DECLARE @QUERY NVARCHAR(4000);
SET @QUERY = N'
SELECT
P.[Tipo Documento],
P.Negocio,
P.Pais,
'+@columnsHeaders + N'
FROM
(
SELECT T.[Tipo Documento]
, T.Negocio
, T.Monto
, T.PAIS
, T.MES
FROM #temp T
) AS T
PIVOT
(
SUM(MONTO)
FOR MES IN (' + @COLUMN + N')
) AS P;';
print @query /* esto te sirve para debugear la consulta */
exec sp_executeSql @query;

Como puedes observar, los totales ya vienen con valor.
En mi blog tienes más información.
