2011-07-29 32 views
7

Tôi có một số trường cơ sở dữ liệu mysql có tên là "số" trong đó có 10 mục nhập có số từ 0-10.Loại trừ mục nhập bằng "0" khi sử dụng AVG

Tôi muốn tìm trung bình này, nhưng không bao gồm tất cả các mục trong đó number = 0. Nhưng tôi cũng muốn đếm có bao nhiêu mục có - bao gồm cả những nơi number = 0.

Vì vậy, tôi không thể chỉ thêm một số WHERE! = 0, vì điều đó sẽ cho kết quả sai trong COUNT của tôi.

Vì vậy, tôi cần mọi thứ như thế nào.

AVG(if(numbers!=0)) AS average 
+0

bạn sẽ cần 2 lựa chọn cho nó. – Rufinus

Trả lời

18

Làm thế nào về điều này?

select avg(nullif(field, 0)) from table; 

Thông báo như thế nào phương pháp này không buộc bạn phải sử dụng một điều khoản where, trong trường hợp bạn muốn sử dụng này như là một phần của một truy vấn lớn, nơi bạn không muốn loại trừ giá trị không ở chung.

Ngoài ra, bằng cách này, avg bỏ qua null giá trị, vì vậy trong ví dụ trên chúng tôi sử dụng để biến nullif0 giá trị vào null giá trị. Nếu bạn sử dụng giá trị null để biểu thị các giá trị không nên tính đến giá trị trung bình (ví dụ: nếu 0 là giá trị hợp pháp), thì chỉ cần sử dụng avg(field).

0
SELECT avg(case 
       when numbers = 0 then null 
       else numbers 
      end) as average, 
     count(*) 
FROM your_table 

Vì giá trị NULL không được sử dụng cho avg() nên làm như vậy.

Các vấn đề liên quan