SQL Count包含零值
发布时间:2020-12-12 08:23:06 所属栏目:MsSql教程 来源:网络整理
导读:我创建了以下存储过程,用于计算所选位置的特定范围之间每天的记录数: [dbo].[getRecordsCount] @LOCATION as INT,@BEGIN as datetime,@END as datetimeSELECTISNULL(COUNT(*),0) AS counted_leads,CONVERT(VARCHAR,DATEADD(dd,DATEDIFF(dd,Time_Stamp)),3) a
我创建了以下存储过程,用于计算所选位置的特定范围之间每天的记录数:
[dbo].[getRecordsCount] @LOCATION as INT,@BEGIN as datetime,@END as datetime SELECT ISNULL(COUNT(*),0) AS counted_leads,CONVERT(VARCHAR,DATEADD(dd,DATEDIFF(dd,Time_Stamp)),3) as TIME_STAMP FROM HL_Logs WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION GROUP BY DATEADD(dd,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,cte_date) <= @END ) SELECT cte_date as TIME_STAMP,ISNULL(COUNT(*),FROM CTE_Dates LEFT JOIN HL_Logs ON DATEADD(dd,Time_Stamp)) = cte_date WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION GROUP BY cte_date 将其分解,CTE使用一个引用自身的联合,以递归方式一次添加一天到上一个日期,并记住该日期作为表的一部分.如果你运行了一个使用CTE并且刚从中选择了*的简单语句,你会看到开始和结束之间的日期列表.然后,语句根据日志时间戳日期将此日期列表连接到日志表,同时使用左连接保留没有日志条目的日期(从“左”侧获取所有行,无论它们是否在“对“或不”.最后,我们按日期和计数分组,我们应该得到你想要的答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |