计数与条件不同
我想要计算一个列中受到特定条件的不同项目的数量,例如,如果表格是这样的:
tag | entryID ----+--------- foo | 0 foo | 0 bar | 3
如果我想将不同标签的数量作为“标签计数”进行计数,并在同一个表中将条目ID> 0的不同标签的数量计为“正数标签数量”,我该怎么办?
我现在从两个不同的表中计数,在第二个表中,我只select了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;
第一个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中正确计数。