COUNT DISTINCT条件

时间:2012-12-27 00:51:36

标签: sql

我想计算受特定条件限制的列中不同项目的数量,例如,如果表格如下:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

如果我想将不同标签的数量计为“标签计数”,并计算条目ID为>的不同标签的数量。 0作为同一个表中的“正标记计数”,我该怎么办?

我现在从两个不同的表中计算,在第二个表中我只选择了entryID大于零的那些行。我认为应该有一种更紧凑的方法来解决这个问题。

5 个答案:

答案 0 :(得分:195)

你可以试试这个:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

第一个count(distinct...)很简单。 第二个看起来有点复杂,实际上与第一个相同,只是你使用case...when子句。在case...when子句中,您只过滤正值。零或负值将为null,并且不包含在计数中。

这里要注意的一件事是,这可以通过阅读一次表来完成。当看起来你必须读两次或更多相同的表时,实际上可以通过在大多数时间读取一次来完成。因此,它将以更少的I / O更快地完成任务。

答案 1 :(得分:1)

这可能有效:

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag

答案 2 :(得分:1)

请尝试以下声明:

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

第一个字段是标签,第二个字段是整个计数,第三个字段是正数字。

答案 3 :(得分:0)

这也可能有效:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

您需要在左连接而不是在where子句中使用entryID条件,以确保在第一个DISTINCT中正确计算任何只有entryID为0的项目。

答案 4 :(得分:0)

当[Entry ID]> 0

时,代码会计算标签和条目ID的唯一/不同组合
select count(distinct(concat(tag,entryId)))
from customers
where id>0

在输出中将显示唯一值的计数 希望对您有帮助