计数与条件不同

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

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

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

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

4 Solutions collect form web for “计数与条件不同”

你可以试试这个:

 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 ,不包括在计数中。

有一件事要注意,这可以通过读一次表来完成。 看来你必须两次或更多地阅读同一张表,实际上大部分时间只能阅读一次。 因此,它将以更less的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 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] 

第一个领域将是第二个标签,第三个将是正数。

这也可能工作:

 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条件,以确保任何只有entryID为0的项目才能在第一个DISTINCT中正确计数。

  • 为什么我们总是喜欢在SQL语句中使用参数?
  • Oracle:如果表存在
  • 插入MySQL表或更新(如果存在)
  • 如何在我的列上创build唯一约束(SQL Server 2008 R2)?
  • LINQ中SQL ISNULL的等价物
  • 确定SQL Server中用户创build的对象
  • 将数据从一个数据库传输到另一个数据库
  • 将date和时间字段组合到DateTime,SQL Server 2008
  • 在一个命令中添加具有外键约束的新列
  • 更改Azure资源组的名称
  • 使用PostgreSQL在同一个查询中更新多行