与count by一起使用时,SQL count(*)给出了错误的答案

时间:2011-08-11 22:46:35

标签: sql postgresql

当我运行此查询时,count(0)为zip ='80005'的集合返回21。

select zip, avg(value), min(value), max(value), count(0) from values group by zip order by zip

真的有109行zip ='80005'。

以下两个查询都显示109行,它们还返回min,max和avg的不同值。

select avg(value), min(value), max(value), count(value) from values where zip='80005'

select zip, avg(value), min(value), max(value), count(value) from values group by zip having zip='80005'

值没有空值。

有没有理由为什么第一个查询在zip ='80005'的集合中返回了错误的行数?

也许这是Postgresql中的一个错误。

4 个答案:

答案 0 :(得分:1)

我认为您希望count(*)不是count(0) ...

答案 1 :(得分:0)

Count(1)Count(*)Count([field])都有效。

我读过一个来源说Count(1)Count(*)之间存在性能差异(据称,count(*)需要更多处理),但是,似乎至少有证据表明对于Postgress& TSQL它没有什么区别。

答案 2 :(得分:0)

乍一看,这看起来像一个错误,很难说没有看到你的数据。

您可以尝试缩小问题的根源。

如果: -

  select zip, avg(value), min(value), max(value), count(value) 
  from values group by zip having zip='80005'

返回109,但是: -

select zip, avg(value), min(value), max(value), count(0) 
from values group by zip order by zip

为80005返回21,执行此操作时返回80005的内容: -

  select zip, avg(value), min(value), max(value), count(value) 
  from values group by zip

答案 3 :(得分:0)

查看是否有zip 80005b的记录,其中 b 是一个或多个尾随空白。这些将整理到您的分组邮编列表中的其他位置。我相信默认情况下,PG在测试两个字符串是否相等时会忽略尾随空格,但不会在GROUP BY中。 (你对zip字段有一个完整性检查约束吗?)