2012-07-05 17 views
5

Cũng như một ví dụ rất đơn giản, chúng ta hãy nói rằng tôi có bảng test với dữ liệu mẫu như sau:Tính có điều kiện: Khác biệt hiệu suất khi sử dụng hàm SUM() so với COUNT()?

a  |  b  
------------- 
1  | 18 
1  | 24 
1  | 64 
1  | 82 
1  | 10 
1  |  7 
2  |  5 
2  | 18 
2  | 66 
2  | 72 
3  | 81 
3  | 97 

Và đối với mỗi a, tôi để có được số lượng bao nhiêu b 's có được < 50. kết quả sẽ trông giống như:

a  | bcnt 
-------------- 
1  |  4 
2  |  2 
3  |  0 

Bây giờ tôi có thể đạt được kết quả này bằng một trong hai cách:

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt 
FROM test 
GROUP BY a 

Hoặc:

SELECT a, SUM(CASE WHEN b < 50 THEN 1 ELSE 0 END) AS bcnt 
FROM test 
GROUP BY a 

Tôi biết điều này có vẻ như một vấn đề tầm thường không đáng kể như vậy, nhưng câu hỏi của tôi là sẽ có được bất kỳ lợi thế (tuy nhiên rất nhẹ) trong việc sử dụng một cách tiếp cận trong khác về: Hiệu suất? ... Có bao nhiêu DBMS khác mà họ sẽ làm việc? ... Rõ ràng về tuyên bố? ... v.v.

+3

"Tôi muốn nhận ** số ** ..." Để hỏi là trả lời? :-) – Eric

Trả lời

7

Hiệu suất?

Ồ, sự khác biệt, nếu có, sẽ là cận biên, tôi chắc chắn. Tôi sẽ không lo lắng gì cả.

Có bao nhiêu DBMS khác họ sẽ làm việc?

Tôi đã không có nghi ngờ cả hai sẽ làm việc trong bất kỳ sản phẩm SQL lớn ít nhất, vì vậy, một lần nữa, điều này sẽ không là một vấn đề đáng quan tâm, không phải với tôi anyway.

Độ rõ ràng của tuyên bố?

Chắc chắn COUNT diễn tả nó rõ ràng rằng bạn muốn đếm sự vật, không để thêm lên một số giá trị tùy ý. Với SUM, bạn sẽ nhận ra ý định thực sự chỉ khi đạt đến phần THEN 1 sau khi lướt qua điều kiện.

Ngoài ra, nếu tôi sử dụng COUNT Tôi có thể bỏ qua phần ELSE NULL, bởi vì đó là những gì được ngụ ý khi không có ELSE.Nếu tôi bỏ qua ELSE 0 trong biểu thức SUM, tôi có thể kết thúc với kết quả NULL thay vì có thể là mong đợi 0.

Mặt khác, có thể được tình huống khá ngược lại, nơi nó sẽ được thuận tiện hơn để trở NULL thay vì 0 như là kết quả của đếm. Vì vậy, nếu tôi sử dụng COUNT, tôi sẽ phải làm một cái gì đó như NULLIF(COUNT(CASE ...), 0), trong khi với SUM(CASE ...) nó sẽ chỉ đủ để loại bỏ mệnh đề ELSE. Nhưng ngay cả trong trường hợp đó tôi vẫn có thể thích sự rõ ràng hơn một chút để ngắn gọn hơn một chút mơ hồ (những thứ khác bằng nhau).

-1

Với COUNT, bạn tính các phần tử, sử dụng SUM bạn thêm số (dương, âm hoặc không) cho một kết quả có thể âm.

2

Whats sai với một mệnh đề where:

select a, count(b) 
from test 
where b < 50 
group by a 
+0

Eh? Có cho kết quả lọc của các hàm tổng hợp. Bạn có nghĩa là ở đâu? – podiluska

+0

@Paddy Sẽ cung cấp cho một ORA-00979: không phải là một biểu tượng GROUP BY ... – beny23

+0

xin lỗi, bạn hoàn toàn đúng, sẽ chỉnh sửa. – Paddy

3

Cá nhân, tôi sẽ sử dụng

select a, count(b) 
    from test 
where b < 50 
group by a 

rõ ràng, súc tích và theo SQL fiddle này nhanh hơn những người khác một chút (cần ít dữ liệu theo với kế hoạch thực hiện, mặc dù với một bảng nhỏ mà bạn sẽ không nhận thấy sự khác biệt):