Com base em outras respostas postadas.
Ambos produzirão os valores corretos:
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 ;
No entanto, o desempenho é bem diferente, o que obviamente será mais relevante à medida que a quantidade de dados aumentar.
Descobri que, assumindo que nenhum índice foi definido na tabela, a consulta usando as SUMs faria uma única varredura de tabela, enquanto a consulta com os COUNTs faria várias varreduras de tabela.
Como exemplo, execute o seguinte script:
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)
Destaque as 2 instruções SELECT e clique no ícone Exibir plano de execução estimado. Você verá que a primeira instrução fará uma varredura de tabela e a segunda fará 4. Obviamente, uma varredura de tabela é melhor que 4.
Adicionar um índice em cluster também é interessante. Por exemplo
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
A primeira SELEÇÃO acima fará uma única Verificação de Índice em Cluster. O segundo SELECT fará 4 buscas de índice em cluster, mas elas ainda são mais caras que uma única verificação de índice em cluster. Tentei a mesma coisa em uma tabela com 8 milhões de linhas e o segundo SELECT ainda era muito mais caro.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'