sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Count para incluir valores cero

No tanto la cláusula WHERE, sino el GROUP BY. La consulta solo devolverá datos para las filas que existen. Eso significa que cuando está agrupando por la fecha de la marca de tiempo, solo se devolverán los días para los que hay filas. SQL Server no puede saber por el contexto que desea "llenar los espacios en blanco", y no sabría con qué.

La respuesta normal es un CTE que produce todos los días que desea ver, llenando así los espacios en blanco. Este es un poco complicado porque requiere una instrucción SQL recursiva, pero es un truco bien conocido:

WITH CTE_Dates AS
(
    SELECT @START AS cte_date
    UNION ALL
    SELECT DATEADD(DAY, 1, cte_date)
    FROM CTE_Dates
    WHERE DATEADD(DAY, 1, cte_date) <= @END
)
SELECT
cte_date as TIME_STAMP,
ISNULL(COUNT(HL_Logs.Time_Stamp), 0) AS counted_leads, 
FROM CTE_Dates
LEFT JOIN HL_Logs ON DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)) = cte_date
WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
GROUP BY cte_date

Al desglosarlo, el CTE usa una unión que se referencia a sí mismo para agregar recursivamente un día a la vez a la fecha anterior y recordar esa fecha como parte de la tabla. Si ejecutó una declaración simple que usó el CTE y simplemente seleccionó * de ella, vería una lista de fechas entre el inicio y el final. Luego, la declaración une esta lista de fechas a la tabla de registro en función de la fecha de la marca de tiempo del registro, al tiempo que conserva las fechas que no tienen entradas de registro mediante la combinación izquierda (toma todas las filas del lado "izquierdo", ya sea que tengan filas coincidentes en el " lado derecho" o no). Finalmente, agrupamos por fecha y contamos en su lugar y deberíamos obtener la respuesta que desea.