답변:
이것을 시도 할 수 있습니다.
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절 에서는 양수 값만 필터링합니다. 0 또는 음수 값은로 평가되며 null개수에 포함되지 않습니다.
여기서 주목해야 할 점은 표를 한 번 읽으면이 작업을 수행 할 수 있다는 것입니다. 같은 표를 두 번 이상 읽어야 할 것 같으면 실제로는 대부분의 시간에 한 번 읽어야 할 수 있습니다. 결과적으로 더 적은 I / O로 작업을 훨씬 빠르게 완료합니다.
다음 문장을 시도하십시오.
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
entryID가 0 인 모든 항목이 첫 번째 DISTINCT에서 제대로 계산되도록하려면 where 절이 아니라 왼쪽 조인에 entryID 조건이 필요합니다.