count(*)SQL语句中需要“group by”吗?

时间:2014-02-20 14:05:43

标签: sql postgresql

以下声明适用于我的数据库:

select column_a, count(*) from my_schema.my_table group by 1;

但这个没有:

select column_a, count(*) from my_schema.my_table;

我收到错误:

  

错误:列“my_table.column_a”必须出现在GROUP BY子句中   或用于聚合函数

有用的提示:此主题:What does SQL clause "GROUP BY 1" mean?讨论“group by 1”的含义。

更新

我感到困惑的原因是因为我经常看到count(*)如下:

select count(*) from my_schema.my_table

其中有没有 group by声明。 COUNT是否始终需要group by?在这种情况下隐含group by语句吗?

4 个答案:

答案 0 :(得分:2)

这个错误非常有意义。 COUNT是一个“聚合”函数。所以你需要告诉它聚合哪个字段,这是用GROUP BY子句完成的。

在你的情况下可能最有意义的那个是:

SELECT column_a, COUNT(*) FROM my_schema.my_table GROUP BY column_a;

如果使用COUNT(*)子句,则要求返回完整的行数,而不是按其他条件聚合。在这种情况下你的GROUP BY是隐含的,可以回答:“排序”:如果你没有指定任何东西有点像问:“一无所有”,这意味着你会得到一个巨大的聚合,这是整个表格。

例如,执行:

SELECT COUNT(*) FROM table;

将显示该表中的行数,而:

SELECT col_a, COUNT(*) FROM table GROUP BY col_a;

将显示col_a值的行数。类似的东西:

    col_a  | COUNT(*)
  ---------+----------------
    value1 | 100
    value2 | 10
    value3 | 123

您还应该考虑到*意味着计算所有内容。包括NULL s!如果要计算特定条件,则应使用COUNT(expression)!有关此主题的详细信息,请参阅the docs about aggragate functions

答案 1 :(得分:1)

如果您拥有countsum等功能,则需要对其他列进行分组。这相当于您的查询:

select column_a, count(*) from my_schema.my_table group by column_a;

当您使用count(*)而没有其他列时,您将从表中计算SELECT *的所有行。当您在另一列旁边使用count(*)时,您将计算该另一列的每个不同值的行数。因此,在这种情况下,您需要对结果进行分组,以便仅显示每个值及其计数一次。

答案 2 :(得分:1)

如果您根本不使用Group by子句,那么将返回的所有内容都是每行的计数1,无论如何都已经假设,因此是冗余数据。通过添加GROUP BY 1,您已对信息进行了分类,从而使其成为非冗余信息,即使它在理论上返回与创建错误的语句相同的结果。

答案 3 :(得分:1)

在这种情况下,

group by 1是指column_a,其中您的查询中的列位置为1。

这就是为什么它适用于您的服务器。事实上,这在sql中并不是一个好习惯。 您应该提及列名,因为列顺序可能会在表中更改,因此很难维护此代码。

最佳解决方案是:

select column_a, count(*) from my_schema.my_table group by column_a;