S'appuyant sur d'autres réponses publiées.
Les deux produiront les bonnes valeurs:
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 ;
Cependant, les performances sont assez différentes, ce qui sera évidemment plus pertinent à mesure que la quantité de données augmente.
J'ai trouvé que, en supposant qu'aucun index n'était défini sur la table, la requête utilisant les SUM ferait une seule analyse de table, tandis que la requête avec les COUNT ferait plusieurs analyses de table.
Par exemple, exécutez le script suivant:
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)
Mettez en surbrillance les 2 instructions SELECT et cliquez sur l'icône Afficher le plan d'exécution estimé. Vous verrez que la première instruction fera une analyse de table et la seconde fera 4. Évidemment, une analyse de table vaut mieux que 4.
L'ajout d'un index cluster est également intéressant. Par exemple
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
Le premier SELECT ci-dessus fera une seule analyse d'index en cluster. Le second SELECT effectuera 4 recherches d'index en cluster, mais elles sont toujours plus chères qu'une seule analyse d'index en cluster. J'ai essayé la même chose sur une table avec 8 millions de lignes et le deuxième SELECT était encore beaucoup plus cher.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'