txt instrucción ejemplos delimitador sql-server group-by sum zero

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.