【问题标题】:sql sum and count functions with inner join带有内部连接的sql sum和count函数
【发布时间】:2013-10-26 19:21:53
【问题描述】:
select * 
from Table1 t1
inner join Table2 t2 on t1.id=t2.tid

返回 102 行

select sum(t1.val), count(t1.val) 
from Table1 t1
inner join Table2 t2 on t1.id=t2.tid

返回 29000 103

这意味着第二个查询不能正常工作。什么问题?

【问题讨论】:

  • 你能在SQLFiddle上复制这个吗?
  • 我们需要 SqlFiddle // 表格脚本。
  • 这似乎是不可能的。您无法使用相同的联接获得更多值。您必须有错字或混合了结果,或者您没有粘贴实际查询。
  • 我无法在 sql fiddle 中重现。看到这个:sqlfiddle.com/#!4/9a5f0/3

标签: sql count sum


【解决方案1】:

由于您尚未指定 DBMS,因此我仅根据您标记的 SQL 进行回答。无论如何,这应该适用于任何 DBMS。

您有 2 个具有相同联接的不同查询。在这两种情况下,连接将生成相同数量的结果。从第一个就清楚了,join后有102个结果。

如果您想计算这些行数,则无法获得比实际更多的行数。因为count(field) 聚合函数只会计算field 的非空值,所以可能会得到更少。

但是,你说你得到了更多,这是绝对不可能的。

【讨论】:

    【解决方案2】:

    看起来您的 103 个值之一在 val 列中有 null。

    select sum(t1.val), count(*) 
    from Table1 t1
    inner join Table2 t2 on t1.id=t2.tid
    

    这应该返回 103 进行计数。至少在 MS SQL Server 中。但我认为它是 SQL ANSI 的一部分,因此应该适用于所有符合 SQL ANSI 的数据库引擎

    【讨论】:

    • 但是如果 103 中有 1 个为空,那么第二个查询应该返回 102,对吧?
    • @KirillPolishchuk 你比我更严厉一点:P
    • 哦。我查看了这些结果,但它们没有任何意义..您只能在 count(t1.val) 中获得更少的结果,而不是更多.. 伙计,也许有人在这些请求之间插入了更多值))
    • @KirillPolishchuk 我的描述是正确的,问题有点奇怪
    • 不幸的是,我无法显示真实的查询和答案,但这是真的。而且我已经检查并重新检查了所有变体。唯一的原因可能是我们在发送查询执行之前使用了特殊的 sql 解析器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多