2012-05-22 40 views
7

Tôi có một số vấn đề khi viết truy vấn SQL cho MySQL. Tôi có một bảng với cấu trúc sau:Truy vấn SQL với avg và nhóm theo

mysql> select id, pass, val from data_r1 limit 10; 
+------------+--------------+----------------+ 
| id   | pass   | val   | 
+------------+--------------+----------------+ 
| DA02959106 | 5.0000000000 | 44.4007000000 | 
| 08A5969201 | 1.0000000000 | 182.4100000000 | 
| 08A5969201 | 2.0000000000 | 138.7880000000 | 
| DA02882103 | 5.0000000000 | 44.7265000000 | 
| DA02959106 | 1.0000000000 | 186.1470000000 | 
| DA02959106 | 2.0000000000 | 148.2660000000 | 
| DA02959106 | 3.0000000000 | 111.9050000000 | 
| DA02959106 | 4.0000000000 | 76.1485000000 | 
| DA02959106 | 5.0000000000 | 44.4007000000 | 
| DA02959106 | 4.0000000000 | 76.6485000000 | 

Tôi muốn tạo ra một truy vấn mà chiết xuất các thông tin sau từ bảng:

id, AVG of 'val' for 'pass' = 1, AVG of 'val' for 'pass' = 2, etc 

Kết quả của truy vấn sẽ trông như thế này:

+------------+---------+---------+---------+---------+---------+---------+---------+ 
| id   | val_1 | val_2 | val_3 | val_4 | val_5 | val_6 | val_7 | 
+------------+---------+---------+---------+---------+---------+---------+---------+ 
| DA02959106 | 186.147 | 148.266 | 111.905 | 76.3985 | 44.4007 | 0  | 0  | 
+------------+---------+---------+---------+---------+---------+---------+---------+ 

với nhiều hàng hơn cho mỗi 'id' duy nhất, tất nhiên.

Tôi đã thử một số truy vấn như

SELECT id, pass, AVG(val) AS val_1 FROM data_r1 WHERE pass = 1 GROUP BY id; 

này trả về kết quả chính xác, nhưng tôi phải mở rộng nó với kết quả cho các giá trị khác có thể xảy ra 'vượt qua' (lên đến 7)

tôi đã cố gắng sử dụng một SELECT lồng nhau trong AVG nhưng điều này đã không làm việc vì tôi đã không tìm ra cách để giới hạn chính xác nó đến 'id' hiện tại.

Sau đó, tôi đã tạo Chế độ xem để biểu thị kết quả của mỗi truy vấn cho 'pass' = 1, 'pass' = 2, v.v. Nhưng đối với hầu hết các id, giá trị cao nhất cho 'pass' là 5. Khi sử dụng JOIN queries để nhận kết quả cuối cùng từ các khung nhìn tôi nhận được một tập kết quả rỗng, bởi vì một số các khung nhìn là rỗng/không có các giá trị cho một 'id' cụ thể.

Bất kỳ ý tưởng nào?

+0

Bạn có '3' hồ sơ với' qua = 5', tất cả đều có id khác nhau. Bạn muốn cái nào trong số các 'id' này? Vui lòng đăng đầu ra bạn mong đợi cho dữ liệu bạn đã cung cấp. – Quassnoi

+0

Giá trị AVG của bạn có phải nằm trong cột hoặc truy vấn mong muốn của bạn có trả về nhiều hàng vì có nhiều giá trị vượt qua khác nhau không? –

+0

Tôi đã chỉnh sửa câu hỏi của tôi và thêm một bảng như thế nào tôi mong đợi kết quả của tôi. Tôi phải cung cấp kết quả cho một chương trình khác, vì vậy sẽ có một id cho mỗi hàng. – theFen

Trả lời

20

Nếu tôi hiểu những gì bạn cần, hãy thử này:

SELECT id, pass, AVG(val) AS val_1 
FROM data_r1 
GROUP BY id, pass; 

Hoặc, nếu bạn muốn chỉ là một hàng cho mỗi id, này:

SELECT d1.id, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 1) as val_1, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 2) as val_2, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 3) as val_3, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 4) as val_4, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 5) as val_5, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 6) as val_6, 
    (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 
    WHERE d2.id = d1.id AND pass = 7) as val_7 
from data_r1 d1 
GROUP BY d1.id 
+0

anh ấy không muốn điều này. điều này sẽ trả về 5 hàng và anh ta chỉ muốn một hàng với tất cả dữ liệu. –

+0

@ theFen: thử truy vấn đã chỉnh sửa của tôi. – Marco

+0

+1 bây giờ điều này giống như nó: D –

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