Basandosi su altre risposte postate.
Entrambi produrranno i giusti valori:
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 ;
Tuttavia, le prestazioni sono piuttosto diverse, il che sarà ovviamente più rilevante all'aumentare della quantità di dati.
Ho scoperto che, supponendo che non siano stati definiti indici sulla tabella, la query che utilizza SUM eseguirà una singola scansione della tabella, mentre la query con COUNT eseguirà più scansioni della tabella.
Ad esempio, esegui il seguente 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)
Evidenziare le 2 istruzioni SELECT e fare clic sull'icona Visualizza piano di esecuzione stimato. Vedrai che la prima istruzione eseguirà una scansione della tabella e la seconda farà 4. Ovviamente una scansione della tabella è migliore di 4.
Anche l'aggiunta di un indice cluster è interessante. Per esempio
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
Il primo SELECT sopra farà una singola scansione dell'indice cluster. Il secondo SELECT eseguirà 4 ricerche di indice cluster, ma sono ancora più costose di una singola scansione di indice cluster. Ho provato la stessa cosa su un tavolo con 8 milioni di righe e il secondo SELECT era ancora molto più costoso.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'