Sobre la base de otras respuestas publicadas.
Ambos producirán los valores correctos:
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 ;
Sin embargo, el rendimiento es bastante diferente, lo que obviamente será más relevante a medida que aumente la cantidad de datos.
Descubrí que, suponiendo que no se definieran índices en la tabla, la consulta que usa los SUMs haría un escaneo de una sola tabla, mientras que la consulta con los COUNT haría múltiples escaneos de la tabla.
Como ejemplo, ejecute el siguiente 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)
Resalte las 2 declaraciones SELECT y haga clic en el icono Mostrar plan de ejecución estimado. Verá que la primera instrucción hará un escaneo de tabla y la segunda hará 4. Obviamente, un escaneo de tabla es mejor que 4.
Agregar un índice agrupado también es interesante. P.ej
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
El primer SELECT anterior hará un solo escaneo de índice agrupado. El segundo SELECT realizará 4 búsquedas de índice agrupado, pero aún son más caras que un solo escaneo de índice agrupado. Intenté lo mismo en una mesa con 8 millones de filas y el segundo SELECT todavía era mucho más caro.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'