다른 게시 된 답변을 기반으로합니다.
이 두 가지 모두 올바른 값을 생성합니다.
select distributor_id,
count(*) total,
sum(case when level = 'exec' then 1 else 0 end) ExecCount,
sum(case when level = 'personal' then 1 else 0 end) PersonalCount
from yourtable
group by distributor_id
SELECT a.distributor_id,
(SELECT COUNT(*) FROM myTable WHERE level='personal' and distributor_id = a.distributor_id) as PersonalCount,
(SELECT COUNT(*) FROM myTable WHERE level='exec' and distributor_id = a.distributor_id) as ExecCount,
(SELECT COUNT(*) FROM myTable WHERE distributor_id = a.distributor_id) as TotalCount
FROM myTable a ;
그러나 성능이 상당히 다르기 때문에 데이터 양이 증가함에 따라 더 관련성이 높습니다.
테이블에 인덱스가 정의되어 있지 않다고 가정하면 SUM을 사용하는 쿼리는 단일 테이블 스캔을 수행하고 COUNT가 포함 된 쿼리는 여러 테이블 스캔을 수행한다는 것을 알았습니다.
예를 들어 다음 스크립트를 실행하십시오.
IF OBJECT_ID (N't1', N'U') IS NOT NULL
drop table t1
create table t1 (f1 int)
insert into t1 values (1)
insert into t1 values (1)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (2)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (3)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
insert into t1 values (4)
SELECT SUM(CASE WHEN f1 = 1 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 2 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 3 THEN 1 else 0 end),
SUM(CASE WHEN f1 = 4 THEN 1 else 0 end)
from t1
SELECT
(select COUNT(*) from t1 where f1 = 1),
(select COUNT(*) from t1 where f1 = 2),
(select COUNT(*) from t1 where f1 = 3),
(select COUNT(*) from t1 where f1 = 4)
2 개의 SELECT 문을 강조 표시하고 Estimated Execution Plan 표시 아이콘을 클릭하십시오. 첫 번째 명령문은 하나의 테이블 스캔을 수행하고 두 번째 명령문은 4를 수행함을 알 수 있습니다. 분명히 하나의 테이블 스캔이 4보다 낫습니다.
클러스터형 인덱스를 추가하는 것도 흥미 롭습니다. 예 :
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
위의 첫 번째 SELECT는 단일 클러스터형 인덱스 스캔을 수행합니다. 두 번째 SELECT는 4 개의 클러스터형 인덱스 검색을 수행하지만 단일 클러스터형 인덱스 스캔보다 여전히 비쌉니다. 나는 800 만 행이있는 테이블에서 같은 것을 시도했지만 두 번째 SELECT는 여전히 훨씬 비쌉니다.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'