2009-04-02 50 views
8

AVG() chức năng tính toán cột-means nhưng làm thế nào tôi có thể lấy giá trị trung bình của một vài giá trị trong cùng hàng như sau:Truy vấn MySQL: Cách tính trung bình của các giá trị trong một hàng?

SELECT MEAN(A.a, A.b, ... , A.n) FROM A; 

EDIT: chắc chắn, như cherouvim gợi ý tôi có thể làm:

SELECT MEAN(A.a + A.b + ... + A.n)/n FROM A; 

nhưng tôi đang cố gắng tìm hiểu xem có cách nào gọn gàng hơn không.

+0

Giàu B: Tôi có cách cá nhân của tôi như thế nào tôi muốn đặt câu hỏi, bạn không cần phải thay đổi tiêu đề của tôi một cách hệ thống ! – markus

+0

Nếu bạn có các cột trong sự sắp xếp bạn mô tả, đó là một lá cờ đỏ mà bảng này không được chuẩn hóa đúng cách. Chúng phải là các hàng trong bảng con. –

+0

@Bill: có thể là mùi nhưng tôi không nghĩ đó là trường hợp ở đây. Tôi có kết quả mục câu hỏi duy nhất trong một hàng dữ liệu tương ứng với một người dùng và một phép đo. – markus

Trả lời

7
select (A.a + A.b)/2 from A; 
+0

tốt, tôi cần nó chung chung hơn, có nghĩa là cho x vars. – markus

+0

Chắc chắn bạn sẽ luôn biết số hoặc cột cho một bảng nhất định? –

+0

@tharkun: điều này có nghĩa là bạn sẽ chọn cột X và bạn không biết X? Bạn đang cố gắng để thực hiện? – cherouvim

0

Nếu không tìm thấy giải pháp nào tốt hơn, bạn luôn có thể thêm chúng cùng nhau, sau đó chia cho số cột bạn đã thêm.

0

Không đẹp, nhưng nó hoạt động.

Không cụ thể MySql, nhưng ý tưởng phải dễ dàng đủ để dịch hơn.

CREATE TABLE A (id int identity(1,1), C1 int, C2 int, C3 int) 
GO 

INSERT INTO A VALUES (1,1,1) 
INSERT INTO A VALUES (2,2,2) 
INSERT INTO A VALUES (3,3,3) 
INSERT INTO A VALUES (1,2,3) 
INSERT INTO A VALUES (4,5,6) 
GO 

CREATE VIEW A_Values 
AS 
SELECT ID, AVG(Val) AS Average 
FROM 
(
    SELECT ID, C1 AS Val FROM A 
    UNION ALL 
    SELECT ID, C2 AS Val FROM A 
    UNION ALL 
    SELECT ID, C3 AS Val FROM A 
) Q 
GROUP BY ID 
GO 


SELECT * FROM A_Values 
GO 
+0

thú vị nhưng không phải mysql và không leaner;) – markus

0

Tôi không quen thuộc với cú pháp MySQL, nhưng những gì về bán phá giá các dữ liệu hàng vào một bảng tạm thời như nhiều hàng với một cột duy nhất, và sau đó sử dụng AVG() chức năng để có được kết quả của bạn?

1

Tôi tình cờ gặp một tình huống tương tự. Này đến hữu ích: http://tech-blog.borychowski.com/index.php/2009/02/mysql/average-value-in-a-row/

Từ trang này:

Khi chúng ta làm:

SELECT *, (V.rank_0 + V.rank_1 + V.rank_2)/3 
AS row_avg FROM voting V 

chúng tôi chỉ nhận được trung bình chính xác cho các hàng nơi mà tất cả các giá trị không phải là NULL. Nhưng khi tôi có ví dụ 3, NULL, 4 Tôi muốn nhận được 3,5 như một sự trở lại. Đó là thời điểm hàm COALESCE() có ích.

COALESCE() làm gì? Từ hướng dẫn sử dụng MySQL, chúng tôi có:

Trả về giá trị không NULL đầu tiên trong danh sách hoặc NULL nếu không có giá trị không NULL.

mysql> SELECT COALESCE(NULL,1); 
-> 1 
mysql> SELECT COALESCE(NULL,NULL,NULL); 
-> NULL 

Và những thông tin này sẽ giúp chúng ta xây dựng một câu lệnh SELECT:

SELECT *, 

#first part 
(COALESCE(V.rank_0, 0) 
+ COALESCE(V.rank_1, 0) 
+ COALESCE(V.rank_2, 0)) 
/

#second part 
(3 - 
(COALESCE(V.rank_0 - V.rank_0, 1) 
+ COALESCE(V.rank_1 - V.rank_1, 1) 
+ COALESCE(V.rank_2 - V.rank_2, 1)) 
) AS row_avg FROM voting V 
Các vấn đề liên quan