Membangun jawaban diposting lainnya.
Kedua hal ini akan menghasilkan nilai yang benar:
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 ;
Namun, kinerjanya sangat berbeda, yang jelas akan lebih relevan ketika jumlah data bertambah.
Saya menemukan bahwa, dengan asumsi tidak ada indeks yang didefinisikan pada tabel, kueri yang menggunakan SUM akan melakukan pemindaian tabel tunggal, sedangkan kueri dengan COUNT akan melakukan beberapa pemindaian tabel.
Sebagai contoh, jalankan skrip berikut:
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)
Sorot 2 pernyataan SELECT dan klik ikon Display Estimated Execution Plan. Anda akan melihat bahwa pernyataan pertama akan melakukan satu pemindaian tabel dan yang kedua akan 4. 4. Jelas satu pemindaian tabel lebih baik dari 4.
Menambahkan indeks berkerumun juga menarik. Misalnya
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
SELECT pertama di atas akan melakukan satu Pemindaian Indeks Clustered. SELECT kedua akan melakukan 4 Pencarian Indeks Clustered, tetapi mereka masih lebih mahal daripada Scan Index Clustered tunggal. Saya mencoba hal yang sama di atas meja dengan 8 juta baris dan SELECT kedua masih jauh lebih mahal.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'