gpt4 book ai didi

包含零值的 SQL 计数

转载 作者:行者123 更新时间:2023-12-04 13:33:28 29 4
gpt4 key购买 nike

我创建了以下存储过程,用于计算选定位置的特定范围之间每天的记录数:

[dbo].[getRecordsCount] 
@LOCATION as INT,
@BEGIN as datetime,
@END as datetime

SELECT
ISNULL(COUNT(*), 0) AS counted_leads,
CONVERT(VARCHAR, DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)), 3) as TIME_STAMP
FROM HL_Logs
WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
GROUP BY DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp))

但问题是结果没有显示记录为零的日子,我很确定这与我的 WHERE 语句不允许显示零值有关,但我不知道如何解决这个问题.

提前致谢
尼尔

最佳答案

与其说是 WHERE 子句,不如说是 GROUP BY。查询将只返回存在的行的数据。这意味着当您按时间戳的日期分组时,只会返回有行的天数。 SQL Server 无法从上下文中知道您要“填空”,它也不知道用什么。
正常的答案是一个 CTE,它产生你想看到的所有日子,从而填补空白。这个有点棘手,因为它需要一个递归的 SQL 语句,但它是一个众所周知的技巧:

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
分解一下,CTE 使用一个联合引用自身来递归地将一天添加到前一个日期,并将该日期作为表的一部分记住。如果您运行使用 CTE 的简单语句并从中选择 *,您将看到开始和结束之间的日期列表。然后,该语句根据日志时间戳日期将此日期列表连接到日志表,同时使用左连接保留没有日志条目的日期(从“左”侧获取所有行,无论它们在“右”侧或不)。最后,我们按日期分组并计数,我们应该会得到您想要的答案。

关于包含零值的 SQL 计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12372708/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com