Xây dựng trên các câu trả lời được đăng khác.
Cả hai điều này sẽ tạo ra các giá trị đúng:
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 ;
Tuy nhiên, hiệu suất khá khác nhau, điều này rõ ràng sẽ phù hợp hơn khi số lượng dữ liệu tăng lên.
Tôi thấy rằng, giả sử không có chỉ mục nào được xác định trên bảng, truy vấn sử dụng SUM sẽ thực hiện quét một bảng, trong khi truy vấn với COUNT sẽ thực hiện quét nhiều bảng.
Ví dụ: chạy tập lệnh sau:
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)
Đánh dấu 2 câu lệnh CHỌN và nhấp vào biểu tượng Kế hoạch thực hiện ước tính hiển thị. Bạn sẽ thấy rằng câu lệnh đầu tiên sẽ thực hiện một lần quét bảng và lần thứ hai sẽ thực hiện 4. Rõ ràng một lần quét bảng tốt hơn 4.
Thêm một chỉ số cụm cũng thú vị. Ví dụ
Create clustered index t1f1 on t1(f1);
Update Statistics t1;
CHỌN đầu tiên ở trên sẽ thực hiện Quét chỉ mục cụm đơn. CHỌN thứ hai sẽ thực hiện 4 Tìm kiếm chỉ mục cụm, nhưng chúng vẫn đắt hơn một lần quét chỉ mục cụm. Tôi đã thử điều tương tự trên một cái bàn với 8 triệu hàng và CHỌN thứ hai vẫn đắt hơn rất nhiều.
SELECT distributor_id, COUNT(*) AS TOTAL, COUNT(*) WHERE level = 'exec', COUNT(*) WHERE level = 'personal'