sql-server - instrucción - ejemplos de bcp en sql server
T-SQL, suma cero para ninguna coincidencia en la unión (5)
Cambié la combinación de interno a externo izquierdo y agregué la función ISNULL para las sucursales sin ventas.
SELECT
b.BranchName,
s.Month,
SUM(ISNULL(s.InvoiceAmount,0)) AS ''Sales''
FROM
Branch b
LEFT JOIN
Sales s ON s.BranchID = b.BranchID
WHERE
s.Year = 2008
AND
s.SalesRepID= 11
GROUP BY
s.Month,
b.BranchName
ORDER BY
s.Month,
b.BranchName
Tengo dos mesas, una con todas mis sucursales y una con todas mis ventas. La tabla de ventas también contiene una ID de representante de ventas, una ID de sucursal, un mes y un año.
Necesito una consulta que devuelva la suma de las ventas de un representante específico durante un año, agrupadas por rama y mes, y la consulta debe devolver 0 si no ha habido ventas en una sucursal para ese mes. Tengo lo siguiente, que no devuelve 0 si no hay ventas:
SELECT
s.Month,
b.BranchName,
SUM(s.InvoiceAmount) AS ''Sales''
FROM
Branch b
INNER JOIN
Sales s ON s.BranchID = b.BranchID
WHERE
s.Year = 2008
AND
s.SalesRepID= 11
GROUP BY
s.Month,
b.BranchName
ORDER BY
s.Month,
b.BranchName
Deberá agregar los datos "faltantes" para poder unirlos.
SELECT
b.BranchName,
SUM(ISNULL(s.InvoiceAmount, 0)) AS ''Sales'',
s.Month
FROM
Branch b
LEFT OUTER JOIN (
SELECT
b.BranchID AS BranchID
, s.SalesRepID AS SalesRepID
, Months.Month AS Month
, Years.Year AS Year
, 0 AS InvoiceAmount
FROM
Sales s
CROSS JOIN (
SELECT 1 AS Month
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
UNION ALL SELECT 11
UNION ALL SELECT 12
) Months
CROSS JOIN (
SELECT 2007 AS Year
UNION ALL SELECT 2008
UNION ALL SELECT 2009
) Years
CROSS JOIN Branch b
UNION ALL SELECT
s.BranchID AS BranchID
, s.SalesRepID AS SalesRepID
, s.Month AS Month
, s.Year AS Year
, s.InvoiceAmount AS InvoiceAmount
FROM Sales s
)s ON s.BranchID = b.BranchID
WHERE
s.Year = 2008
AND s.SalesRepID= 11
GROUP BY
s.Month,
b.BranchName
ORDER BY
b.BranchName,
s.Month
Necesita usar una combinación izquierda y una isnull para obtener la suma correcta:
SELECT b.BranchName
, SUM(isnull(s.InvoiceAmount, 0)) AS ''Sales''
FROM Branch b
LEFT JOIN Sales s ON s.BranchID = b.BranchID
GROUP BY s.Month, b.BranchName
ORDER BY s.Month, b.BranchName
Aún necesita hacer más trabajo para que los meses también se muestren si un vendedor no tiene ventas en un mes en particular.
Si su consulta devuelve NULL, puede usar uno de los métodos coalescentes: COALESCE(SUM(...), 0)
devolverá el primer valor no NULL en la lista ...
Tendrá que hacer una UNIÓN IZQUIERDA a Ventas, a fin de devolver incluso a los representantes que no tienen ningún registro en la tabla Ventas.