【问题标题】:Postgresql incorrect COUNT() value with left outer join带有左外连接的 Postgresql COUNT() 值不正确
【发布时间】:2020-03-26 13:00:51
【问题描述】:

在 postgresql 9.3 中使用 LEFT OUTER JOIN 时,我遇到了计数聚合问题。

当我在没有左外连接的情况下执行标准语句时,它返回正确的计数,在这种情况下为 3。当语句变得更复杂时,如下面的语句,它返回 7 而不是不正确的。

只有一些 count() 聚合不正确,其中大部分是正确的。这是什么原因造成的?我应该使用其他联接吗?

SELECT country_code, 
       period, 
       COUNT(commissions.id) AS count, 
       SUM(commissions.total) AS total, 
       SUM(CASE WHEN commission_adjustments.is_bonus is True THEN commission_adjustments.total else 0 END) AS bonus
FROM commissions 
  LEFT OUTER JOIN commission_adjustments ON commissions.id = commission_adjustments.commission_id
GROUP BY commissions.country_code, commissions.period 
ORDER BY commissions.country_code, commissions.period

【问题讨论】:

  • 您可能想要count(commission_adjustments.commission_id),但没有一些示例数据,而且您所期望的结果很难说
  • 你是对的,我现在已经编辑了。是的,我知道没有样本数据很难。我希望声明本身可能会很明显。

标签: sql postgresql join count postgresql-9.3


【解决方案1】:

COUNT() 计算非NULL 值的数量。你想要的最简单的解决方案是使用COUNT(DISTINCT)

   COUNT(DISTINCT commissions.id) AS count, 

如果计数很小并且维度很少(这里只有一个维度),这很有效。在其他情况下,您可能希望在加入之前聚合数据。

【讨论】:

  • 这是本例中的问题。非常感谢
【解决方案2】:

如果你有这个:

SELECT * FROM table
id, x
1, 'foo'
2, 'foo'
3, 'foo'

SELECT x, COUNT(*) as ct FROM table GROUP BY x
x, ct
'foo', 3

而且它是“正确的”..

然后你这样做:

SELECT x, COUNT(*) as ct FROM table LEFT JOIN sometable ON table.x = sometable.y GROUP BY x

它突然“出错”:

x, ct
'foo', 7

因为有笛卡尔积;与该行匹配的sometable 不止一行。删除分组/放一个选择 * 看看:

SELECT * FROM table LEFT JOIN sometable ON table.id = sometable.otherid --GROUP BY x

id, x, otherid
1, 'foo', 1
1, 'foo', 1
1, 'foo', 1
2, 'foo', 2
2, 'foo', 2 
2, 'foo', 2
3, 'foo', null

7 行,由以下原因引起:

SELECT * FROM othertable
otherid
1
1
1
2
2
2

othertable 中的多行匹配table 中的一行

您需要限制您的联接,这样它就不会导致这种行的倍增,或者可能在您进行联接之前将您的联接行分组到一个子查询中

如果突然不再需要所有行都匹配,切换 JOIN 类型也会导致出现更多行,但它不会影响您在左侧计算一个表并通过左连接添加另一个表的情况;只有笛卡尔积会在这里颠簸

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多