包含条件的不同区域


104

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

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

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

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

Answers:


258

您可以尝试以下方法:

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


2
但是,positive_tag_count也会不同吗?
derekhh 2012年

编辑后的查询仍然不能解决问题-现在这不适用于不同的entryId值而不是不同的标记吗?
BrianC

这是一个非常聪明的解决方案。
吕克(Luc)2015年

我在不同的列中有多个列(示例count(distinct标签,日期))。有没有一种方法可以在then子句中包含多个列。如果我只是做一个标签,它会抛出一个解析异常
Crusaderpyro '18

@Crusaderpyro这超出了原始问题的范围。我为此提出一个新问题。
ntalbs

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]

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


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

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的所有项目。


1
该查询读取表两次。只能通过一次读取表来完成此操作。
ntalbs 2012年

0

当[条目ID]> 0时,代码会计算标签和条目ID的唯一/不同组合

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.