SQL计数(*)和不同

时间:2009-12-01 13:13:20

标签: sql

为什么我们不能在SQL中使用count(distinct *)?如何计算所有不同的行?

9 个答案:

答案 0 :(得分:32)

select count(*) from (select distinct * from MyTable) as T

虽然我强烈建议您重新考虑使用DISTINCT的任何查询。在很大比例的情况下,GROUP BY更合适(也更快)。

编辑:在阅读了问题评论之后,我应该指出, 从不 要求DBMS做更多的工作而不是实际需要做得到一个结果。如果您事先知道表中没有任何重复的行,则不要使用DISTINCT

答案 1 :(得分:10)

您可以选择表中的所有列并按...分组

SELECT column1, column2, column3, count(*)
FROM someTable
GROUP BY column1, column2, column3

答案 2 :(得分:4)

为什么不呢?

select 
  count(distinct name)
from 
  people

答案 3 :(得分:1)

你的确可以。

但是,如果您有标识符,则不会有任何完全不同的行。但你可以这样做:

SELECT COUNT(DISTINCT SenderID) FROM Messages

答案 4 :(得分:0)

您可以在Sql Server 2005中尝试CTE

;WITH cte AS (
        SELECT  DISTINCT Val1,Val2, Val3
        FROM    @Table
)
SELECT  COUNT(1)
FROM    cte

要回答这个问题,请参阅文档

  

指定所有行都应该是   计算返回总数   表中的行。 COUNT()不接受   参数并不能用   不同。 COUNT()不需要   表达式参数因为,by   定义,它不使用   有关任何特定信息   柱。 COUNT(*)返回的数字   没有指定表中的行   摆脱重复。重要的是   每一行分开。这包括   包含空值的行。

答案 5 :(得分:0)

COUNT(*)是与查询匹配的行数。

一行包含rowid等唯一信息。根据定义,所有行都是不同的。

您必须在某些字段中计算不同的值实例。

答案 6 :(得分:0)

有些语言可能无法处理'distinct *'所以,如果你想通过许多列进行区分,你可能想要使用'distinct ColumnA || ColumnB',在判断它们是否不同之前组合这些值。请注意您的变量是否为数字,并且数据库处理程序可以自动对字符串进行类型转换。

答案 7 :(得分:-2)

UberKludge,可能是postgre特定的,但

select count( distinct table::text ) from table

答案 8 :(得分:-2)

select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value)