Gönderilen diğer cevaplar üzerine bina.
Bunların her ikisi de doğru değerleri üretecektir:
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 ;
Bununla birlikte, performans oldukça farklıdır, bu da veri miktarı arttıkça daha alakalı olacaktır.
COUNTs ile sorgu birden çok tablo tarama yapacağını, hiçbir dizin tablo tanımlanmış varsayarak, TOPLA'ları kullanarak sorgu tek bir tablo tarama yapacağını bulundu.
Örnek olarak, aşağıdaki komut dosyasını çalıştırın:
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 deyimini vurgulayın ve Tahmini Yürütme Planını Görüntüle simgesini tıklatın. İlk ifadenin bir tablo taraması yapacağını ve ikincisinin 4 yapacağını göreceksiniz. Açıkçası bir tablo taraması 4'ten daha iyidir.
Kümelenmiş bir dizin eklemek de ilginçtir. Örneğin
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
Yukarıdaki ilk SELECT, tek bir Kümelenmiş Dizin Tarama gerçekleştirecektir. İkinci SELECT, 4 Kümelenmiş Dizin Araması gerçekleştirir, ancak yine de tek bir Kümelenmiş Dizin Taramasından daha pahalıdır. Aynı şeyi 8 milyon sıralı bir masada denedim ve ikinci SELECT hala çok daha pahalıydı.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'