2011-10-25 44 views
10

Tôi hiện đang làm việc theo một nhiệm vụ yêu cầu tôi tìm mức trung bình về số lượng tài nguyên cho mỗi mô-đun. Bảng hiện tại trông giống như sau:Trung bình trên một số() trong cùng một truy vấn

ResourceID ModulID 
    1   1 
    2   7 
    3   2 
    4   4 
    5   1 
    6   1 

Về cơ bản, tôi đang cố gắng tìm ra cách để có được số lượng tài nguyên trung bình. Chỉ có dữ liệu thử nghiệm có liên quan ở đây là dành cho mô-đun 1, trong đó có 3 tài nguyên khác nhau được kết nối với nó. Nhưng tôi cần hiển thị tất cả các kết quả.

Đây là mã của tôi:

select avg(a.ress) GjSnitt, modulID 
from 
(select count(ressursID) as ress 
from ressursertiloppgave 
group by modulID) as a, ressursertiloppgave r 
group by modulID; 

Rõ ràng nó không phải đang làm việc, nhưng tôi hiện đang ở mất mát về những gì thay đổi vào thời điểm này. Tôi thực sự sẽ đánh giá cao bất kỳ đầu vào bạn guys có.

+0

Bạn có thể không chỉ cần sử dụng truy vấn bên ngoài của bạn ('AVG () 'được nhóm lại bởi ModulId) mà không có truy vấn bên trong? Tôi nghĩ rằng sẽ tạo ra kết quả mong đợi. –

+0

Vấn đề với AVG() là nó lấy giá trị đặt lại với nhau và lấy giá trị trung bình trên một giá trị duy nhất. Ví dụ, Tài nguyên 1,5 và 6 tạo ra 12. Sau đó, nó sử dụng để lấy tổng trung bình. Tôi cần nó là 1,5, vì có 3 resourceID được kết nối với ModulID 1. – Coss

Trả lời

21

Đây là truy vấn bạn đang thực thi, được viết bằng cú pháp hơi ít gây hiểu lầm.

SELECT 
    avg(a.ress) as GjSnitt 
    , modulID 
FROM 
    (SELECT COUNT(ressursID) as ress 
    FROM ressursertiloppgave 
    GROUP BY modulID) as a 
CROSS JOIN ressursertiloppgave r <--- Cross join are very very rare! 
GROUP BY modulID; 

Bạn đang tham gia bảng, tổng cộng (6x6 =) 36 hàng và ngưng tụ xuống 4, nhưng vì tổng số là 36, kết quả sai.
Đây là lý do tại sao bạn không bao giờ nên sử dụng các tham gia ngầm định.

Viết lại các truy vấn để:

SELECT AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r 
    GROUP BY r.ModulID) a 

Nếu bạn muốn rowcount cá nhân tỷ lệ trung bình ở phía dưới làm:

SELECT r1.ModulID, count(*) as rcount 
FROM ressursertiloppgave r1 
GROUP BY r1.ModulID 
UNION ALL 
    SELECT 'avg = ', AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r2 
    GROUP BY r2.ModulID) a 
+0

Tôi nhận được giá trị cho modulID đầu tiên, hiển thị kết quả chính xác. Nhưng làm thế nào để tôi có được phần còn lại của modulID để làm theo? Khi tôi bao gồm modulID trong lựa chọn đầu tiên, và làm một nhóm bằng modulID, tôi nhận được kết quả tương tự được hiển thị bởi mọi modulID. – Coss

+0

@Coss, xem câu hỏi được cập nhật. – Johan

+0

Ah, tôi hiểu rồi! Nhưng tôi nghĩ tôi đã vụng về với câu hỏi của mình. Những gì tôi đang tìm kiếm là trung bình trên mỗi rowcount, nếu đó là có thể. – Coss

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