CONDITIONS가있는 COUNT DISTINCT


104

예를 들어 테이블이 다음과 같은 경우 특정 조건에 따라 열의 고유 항목 수를 계산하고 싶습니다.

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

고유 태그 수를 "태그 수"로 계산하고 항목 ID가 0보다 큰 고유 태그 수를 같은 테이블에서 "양수 태그 수"로 계산하려면 어떻게해야합니까?

이제 두 번째 테이블에서 entryID가 0보다 큰 행만 선택한 두 개의 다른 테이블에서 계산하고 있습니다. 이 문제를 해결할 수있는 더 간결한 방법이 있어야한다고 생각합니다.

답변:


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절 에서는 양수 값만 필터링합니다. 0 또는 음수 값은로 평가되며 null개수에 포함되지 않습니다.

여기서 주목해야 할 점은 표를 한 번 읽으면이 작업을 수행 할 수 있다는 것입니다. 같은 표를 두 번 이상 읽어야 할 것 같으면 실제로는 대부분의 시간에 한 번 읽어야 할 수 있습니다. 결과적으로 더 적은 I / O로 작업을 훨씬 빠르게 완료합니다.


2
그러나 positive_tag_count도 구별 될까요?
derekhh

편집 된 쿼리는 여전히 문제를 해결하지 못합니다. 이제 고유 한 태그가 아닌 고유 한 entryId 값에서 작동하지 않습니까?
BrianC

이것은 정말 영리한 해결책입니다.
Luc

내 고유 한 열이 여러 개 있습니다 (예시 개수 (고유 태그, 날짜)). then 절에 여러 열을 갖는 방법이 있습니까? 난 그냥 태그를 할 경우, 날짜는 구문 분석 예외가 발생합니다
Crusaderpyro

@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

entryID가 0 인 모든 항목이 첫 번째 DISTINCT에서 제대로 계산되도록하려면 where 절이 아니라 왼쪽 조인에 entryID 조건이 필요합니다.


1
이 쿼리는 테이블을 두 번 읽습니다. 테이블을 한 번만 읽으면됩니다.
ntalbs

0

코드는 [Entry Id]> 0 일 때 Tag & Entry ID의 고유 / 고유 조합을 계산합니다.

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

출력에서 고유 값의 개수를 표시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.