Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Contagem SQL para incluir valores zero


Não tanto a cláusula WHERE, mas o GROUP BY. A consulta retornará apenas dados para linhas existentes. Isso significa que quando você está agrupando pela data do carimbo de data/hora, apenas os dias para os quais há linhas serão retornados. O SQL Server não pode saber pelo contexto que você deseja "preencher os espaços em branco" e não saberia com o que.

A resposta normal é um CTE que produz todos os dias que você deseja ver, preenchendo assim os espaços em branco. Este é um pouco complicado porque requer uma instrução SQL recursiva, mas é um truque bem conhecido:
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

Decompondo-o, o CTE usa uma união que faz referência a si mesmo para adicionar recursivamente um dia de cada vez à data anterior e lembrar dessa data como parte da tabela. Se você executasse uma instrução simples que usasse o CTE e apenas selecionasse * dele, você veria uma lista de datas entre o início e o fim. Em seguida, a instrução une essa lista de datas à tabela de log com base na data do registro de data e hora do log, enquanto preserva as datas que não têm entradas de log usando a junção à esquerda (toma todas as linhas do lado "esquerdo" se elas têm linhas correspondentes no " direito" ou não). Por fim, agrupamos por data e contamos e devemos obter a resposta desejada.