2010-03-19 41 views
7

Có cách nào đơn giản để tôi có thể loại trừ các giá trị rỗng khỏi ảnh hưởng đến avg không? Chúng dường như được tính là 0, đó không phải là những gì tôi muốn. Tôi chỉ đơn giản là không muốn đưa trung bình của họ vào tài khoản, nhưng đây là bắt, tôi không thể thả chúng từ tập kết quả, vì hồ sơ đó có dữ liệu về nó mà tôi cần.MySQL: trung bình với nulls

Cập nhật:

dụ:

select avg(col1+col2), count(col3) from table1 
where 
group by SomeArbitraryCol 
having avg(col1+col2) < 500 and count(col3) > 3 
order by avgcol1+col2) asc; 

này sẽ được làm việc cho tôi, nhưng với mức trung bình là không chính xác như họ đang đếm các giá trị null như 0, mà thực sự là ném ra khỏi toàn bộ trung bình.

+0

Ngôn ngữ nào? Hay bạn đang làm tất cả điều này trong SQL? –

+0

SQL đơn giản dưới MySQL – Zombies

+1

Tôi đã không nhận được nó, tại sao không chỉ chọn các bản ghi với giá trị không null và avg chúng? – questzen

Trả lời

13

Các hàm tổng hợp (SUM, AVG, COUNT, v.v.) trong SQL luôn tự động loại trừ NULL.

Vì vậy, SUM (col)/COUNT (col) = AVG (col) - điều này thật tuyệt vời và nhất quán.

Trường hợp đặc biệt là COUNT (*) đếm mỗi hàng.

Nếu bạn tạo biểu thức bằng NULL: A + B trong đó A hoặc B là NULL, thì A + B sẽ là NULL bất kể cột khác là NULL.

Khi có NULL, nói chung, AVG (A + B) <> AVG (A) + AVG (B), và chúng có khả năng sẽ có các mẫu số khác nhau. Bạn sẽ phải bọc các cột: AVG (COALESCE (A, 0) + COALESCE (B, 0)) để giải quyết điều đó, nhưng có lẽ cũng loại trừ trường hợp COALESCE (A, 0) + COALESCE (B, 0).

Dựa trên mã của bạn, tôi sẽ đề nghị:

select avg(coalesce(col1, 0) + coalesce(col2, 0)), count(col3) from table1 
where coalesce(col1, col2) is not null -- double nulls are eliminated 
group by SomeArbitraryCol 
having avg(coalesce(col1, 0) + coalesce(col2, 0)) < 500 and count(col3) > 3 
order by avg(coalesce(col1, 0) + coalesce(col2, 0)) asc; 
5
AVG(number) 

Là cách tốt nhất tôi có thể nghĩ đến. Điều này sẽ tự động không bao gồm các giá trị rỗng. Here là một chút đọc.

+0

Điều này có giống với số 1 + số 2 không? Bởi vì tôi không nhận được điều đó, đối với tôi các nulls xuất hiện để được tính là 0, do đó trọng lượng xuống avg quá nhiều. – Zombies

+0

@Zombies Không, nó không giống với biểu thức bổ sung thủ công tuân theo quy tắc NULL bình thường. –

3
SELECT SUM(field)/COUNT(field) 
FROM table 
WHERE othercondition AND (field IS NOT NULL) 

Link

+0

Điều này sẽ không làm giảm các cols trong đó trường là null? Tôi cần col đó, đó là những gì làm cho điều này khó khăn. – Zombies

+1

AVG (col) luôn luôn tương đương với SUM (col)/COUNT (col), và NULL được tự động loại trừ, do đó truy vấn này sẽ luôn trả về kết quả tương tự như SELECT AVG (trường) TỪ bảng WHERE điều kiện khác. –

1

trả lời dựa trên câu hỏi ban đầu:

SELECT AVG(t1.NumCol + t1.NumCol2), COUNT(table.NumCol) 
FROM 
(
SELECT NumCol, NumCol2 
FROM table 
WHERE (cond) AND (NumCol IS NOT NULL) AND (NumCol2 IS NOT NULL) 
) t1, 
table 
WHERE (cond) 

Tôi nghĩ với những hạn chế mới, điều này vẫn hoạt động về mặt lý thuyết, nhưng không phải là cách hiệu quả nhất

1

Có một cơ hội tốt mà bạn sẽ có thể để có được câu trả lời đúng với những gì người khác đã nói ở đây, nhưng trong trường hợp bạn chưa:

Giá trị nào trong bảng MIGHT là NULL? Và bạn muốn điều gì xảy ra nếu có ai trong số họ?

Bạn không bao giờ xác định những kết quả mà bạn muốn xem nếu col1 là NULL, hoặc col2 là NULL, hoặc nếu họ cả xảy ra được NULL vv

0

Gần đây tôi đã sử dụng thủ thuật này:

AVG(
    CASE 
     WHEN 
      valToBeAveraged IS NULL 
     THEN 
      0 
     ELSE 
      valToBeAveraged 
    END 
) 

Tôi tin rằng cảnh báo chỉ là vậy. Nhưng điều này giúp tôi yên tâm bởi vì tôi biết chính xác nó hoạt động như thế nào.

Mã hóa hạnh phúc

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