Sql 计数与条件不同

Sql 计数与条件不同,sql,Sql,我想根据特定条件计算列中不同项目的数量,例如,如果该表如下所示: tag | entryID ----+--------- foo | 0 foo | 0 bar | 3 如果我想将不同标记的数量计算为“标记计数”,并将条目id>0的不同标记的数量计算为同一个表中的“正标记计数”,我应该怎么做 我现在从两个不同的表中计数,在第二个表中,我只选择entryID大于零的行。我认为应该有一种更简洁的方法来解决这个问题。您可以尝试以下方法: select count(distinct tag) a

我想根据特定条件计算列中不同项目的数量,例如,如果该表如下所示:

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3
如果我想将不同标记的数量计算为“标记计数”,并将条目id>0的不同标记的数量计算为同一个表中的“正标记计数”,我应该怎么做

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

您可以尝试以下方法:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;
第一个
计数(不同的…
很容易。 第二个看起来有点复杂,实际上与第一个相同,只是使用了
case…when
子句。在
case…when
子句中,只过滤正值。零或负值将被计算为
null
,并且不会包含在计数中

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

这可能会起作用:

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

这也可能起作用:

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的任何项。

请尝试以下语句:

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]

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

当[Entry ID]>0时,代码将对标记和条目ID的唯一/独特组合进行计数

select count(distinct(concat(tag,entryId)))
来自客户
其中id>0
在输出中,它将显示唯一值的计数
希望这有帮助

,但是正的\u tag\u计数也会不同吗?编辑的查询仍然不能解决问题-这现在不是在处理不同的entryId值而不是不同的标记吗?这是一个非常聪明的解决方案。我的distinct中有多个列(例如count(distinct tag,date))。有没有办法在then子句中包含多个列。如果我只是做一个标记,它抛出一个解析的日期exception@Crusaderpyro这超出了原来问题的范围。我将为此创建一个新问题。此查询读取表两次。只需阅读表格一次即可完成。
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]