为什么我们不能在SQL中使用count(distinct *)
?如何计算所有不同的行?
答案 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)