有条件的不同数

我想计算一个列中受特定条件限制的不同项的数量,例如,如果表是这样的:

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

如果我想将不同标记的数量计为“标记计数”,并将同一表中条目 id > 0的不同标记的数量计为“正标记计数”,那么应该怎么做?

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

445830 次浏览

你可以试试这个:

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 更快地完成任务。

这可能行得通:

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

这也可能奏效:

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 中正确计算任何只有0个 entryID 的项。

试试下面这句话:

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)))
from customers
where id>0

在输出中,它将显示唯一值的计数 希望这个能帮上忙

我同意@ntalbs 的解决方案, 如果希望在另一列的数据的条件有效时计算该列的数据,可以这样做

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

在第3行,我在 distinct旁边添加了列名,因此当 entryId 大于0时,它将计算不同的标记