当前位置: 首页 > 面试题库 >

SQL计数包含零值

满玉泽
2023-03-14
问题内容

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

[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(*), 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并从中选择*的简单语句,则会看到开始和结束之间的日期列表。然后,该语句根据日志时间戳记日期将此日期列表连接到日志表,同时使用左连接保留没有日志条目的日期(从“左侧”获取所有行,无论它们在“右侧”)。最后,我们按日期分组并计数,我们应该得到想要的答案。



 类似资料:
  • 问题内容: 我想计算购买总数以及随着时间的推移按item_id进行的购买。在此示例中,用户可以拥有一个商品,而这些商品可以由其他用户购买。所有者不能购买自己的物品。 我遇到的问题是如何在没有正整数计数的日子和没有购买的日子返回计数为“ 0”的结果。 这是我的桌子: 这是我的MYSQL查询,购买的商品总数: 结果如下: 这是我想看到的: 这是我的MYSQL查询,用于限制由拥有的购买总数: 结果如下:

  • 问题内容: 谁可以给我解释一下这个?我下面有两个查询及其结果。 查询 : 结果集 : 赫兹租车 海明威小酒馆 查询 : 结果集 : 没有 第一个查询是我期望的,但是我希望第二个查询返回“ Hertz Car Rental”。我是否从根本上误解了“ *”在全文搜索中的工作方式? 谢谢! 问题答案: 我认为SQL Server会将您的字符串解释为prefix_terms。星号不是普通的旧通配符。全文和

  • 问题内容: 给定一个整数,如何使用Java检查它是否包含0? 如何才能做到这一点? 问题答案: 您是说小数表示形式是否包含0?绝对 最简单的 方法是: 别忘了一个数字并不“固有地”包含一个0或不包含0(当然,零本身除外)-它取决于底数。因此,十进制的“ 10”是十六进制的“ A”,而十六进制的“ 10”是十进制的“ 16”……在两种情况下,结果都会改变。 在整数的十进制表示形式中,可能有更有效的方

  • 问题内容: 我正在尝试计算表中的记录,并按日期将它们分组。我当前的查询如下所示: 这行得通,除了我还要数月不存在任何记录的计数。 谁能提供有关如何实现此目标的建议/建议? 问题答案: 在MySQL中执行此操作的最简单方法是创建一个名为的表,该表列出了您感兴趣的所有月份,并在表中使用LEFT JOIN。 但是,由于这主要是一个表示问题,因此通常很容易在您已经在运行的情况下运行查询并在客户端(例如PH

  • 问题内容: 我试图实现的目标很简单,但是很难解释,而且我不知道在postgres中它是否甚至有可能实现。我处于一个基本的水平。,等等基本的东西。 我试图计算包含特定字母/数字的行数,并根据字母/数字显示该计数。 即有多少行的条目包含“ a / A”(不区分大小写) 我要查询的表是电影名称的列表。我要做的只是对“ az”和“ 0-9”进行分组并计数,然后输出总计。我可以依次运行36个查询: 然后在结

  • 问题内容: UTF-8字符串可以包含零字节吗?我要通过ascii纯文本协议发送它,是否应该使用base64之类的东西对其进行编码? 问题答案: 是的,UTF8中的零字节是代码点0,NUL。有没有将在UTF8与在它一个零字节的任何位置进行编码等Unicode代码点。 可能的代码点及其UTF8编码为: 您可以看到,所有非零ASCII字符都被表示为自己,而所有多字节序列的所有字节均具有1的高位。 您可能