135

我想根据特定条件计算列中不同项目的数量,例如,如果表是这样的:

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

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

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

4

6 回答 6

327

你可以试试这个:

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

于 2012-12-27T00:58:10.320 回答
2

这可能有效:

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
于 2012-12-27T01:01:28.770 回答
2

试试下面的语句:

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]

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

于 2014-09-04T15:24:01.257 回答
1

当 [Entry Id]>0 时,代码计算 Tag 和 Entry ID 的唯一/不同组合

select count(distinct(concat(tag,entryId)))
from customers
where id>0

在输出中它将显示唯一值的计数希望这会有所帮助

于 2020-03-02T13:44:16.653 回答
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 的项目。

于 2012-12-27T01:12:46.243 回答
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 时,它将计算不同的标签

于 2022-01-06T15:20:37.933 回答