2013-03-01 35 views
10

Vì vậy, có hàm SQL AVG(), lấy giá trị trung bình của tất cả các giá trị trong một cột, bỏ qua tất cả các giá trị NULL. Nếu một người cần phải tạo một mức trung bình có trọng số, thì họ chỉ cần sử dụng SUM (giá trị * trọng lượng)/SUM (trọng số) với mệnh đề Nhóm theo.Tạo trọng số trung bình - Trọng số giảm cho giá trị NULL

Nếu tôi muốn thực hiện sau, nhưng một số giá trị của tôi là NULL, thì làm cách nào để nói cho SQL bỏ qua trọng số bằng quan sát giá trị NULL trong hàm SUM (trọng số)?

Vấn đề khác của tôi là tôi lấy trung bình 90 cột khác nhau cùng một lúc, vì vậy tôi muốn tránh tạo 90 biến trọng số mới cho phép tính này.

Hãy cho tôi biết nếu tôi đã thực hiện điều này rõ ràng hay không.

Tôi đang sử dụng SQL Server 2005

Trả lời

20

Bạn sẽ sử dụng tổng hợp có điều kiện như là mẫu số:

select sum(value*weight)/sum(case when value is not null then weight else 0 end) 

Nếu trọng lượng luôn lớn hơn 0, sau đó bạn không cần phải lo lắng về việc phân chia bởi 0. Điều đó sẽ chỉ xảy ra khi tất cả các giá trị là NULL. Và, trong trường hợp đó tử số sẽ là NULL.

Bạn cũng có thể cụm từ nó như:

select sum(value*weight)/sum(case when value is not null then weight end) 

hay như:

select sum(case when value is not null then value*weight end)/sum(case when value is not null then weight end) 

Đây là tiết hơn, nhưng làm cho nó rất rõ ràng rằng bạn đang bỏ qua các giá trị NULL ở cả tử số và mẫu số .

+1

@Gordon .... sẽ không phải là bom nếu giá trị là null vì nó sẽ chia cho số không? Hoặc điều gì sẽ xảy ra khi giá trị là null – MikeTWebb

+1

@MikeTWebb. . . NULL trong * any * hoạt động khác với 'IS NULL' và' IS NOT NULL' trả về NULL. Điều đó thậm chí còn đúng cho việc chia cho 0. Nhưng, tôi đã đưa vào phiên bản thứ hai trong trường hợp ai đó có thể nghĩ về điều đó. Nó sẽ rõ ràng hơn trả về NULL nếu không có gì phù hợp. –

+0

+1 nhưng 'um' ... Tôi nghĩ bạn có nghĩa là' sum'. :-) –

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