2012-04-02 38 views
23

Tôi có một bảng mà trông giống như sau:MySQL - Làm thế nào để CHỌN dựa trên giá trị của người khác CHỌN

Name Year Value 
A  2000  5 
A  2001  3 
A  2002  7 
A  2003  1 
B  2000  6 
B  2001  1 
B  2002  8 
B  2003  2 

Người dùng có thể truy vấn dựa trên một loạt các năm, và nó sẽ trở lại với tổng giá trị gia tăng nhóm lại theo tên, như vậy (giả định năm truy vấn là 2000-2001):

Name SUM(Value) 
A   8 
B   7 

Bây giờ, tôi muốn chèn một lĩnh vực tính toán rằng kết quả đầu ra tỷ số giữa tổng của các giá trị của mỗi tên cho TẤT CẢ các năm tới tổng của tất cả các giá trị. Về cơ bản tỷ lệ phần trăm của tất cả các giá trị gán cho A và B, tương ứng, như:

Name SUM(Value) % Of Total 
A   8   0.484  (16/33) 
B   7   0.516  (17/33) 

Lưu ý rằng ngay cả khi người dùng truy vấn chỉ 2000-2001, tôi muốn tính toán để sử dụng số tiền trên tất cả các năm. Tôi đã tìm kiếm và thử nghiệm hàng giờ và tôi không thể tìm ra cách. Tôi chỉ biết cách tính tổng số các năm được truy vấn như sau:

SELECT `Name`, SUM(`Value`)/(SELECT SUM(`Value`) FROM `table1`) AS "% of Total" 
FROM `table1` 
WHERE `Year` BETWEEN 2000 AND 2001 
GROUP BY `Name`; 

Xin vui lòng trợ giúp! Tôi rất nhiều người mới, và không hiểu SQL nhiều, vì vậy hãy làm rõ bất kỳ mã nâng cao nào. Cảm ơn vì lòng tốt của bạn.

Trả lời

42

Bạn có thể tính toán tổng số (và từ đó tỷ lệ mong muốn) bằng cách sử dụng một subquery trong mệnh đề FROM:

SELECT Name, 
     SUM(Value) AS "SUM(VALUE)", 
     SUM(Value)/totals.total AS "% of Total" 
FROM table1, 
     (
      SELECT Name, 
        SUM(Value) AS total 
      FROM table1 
      GROUP BY Name 
     ) AS totals 
WHERE table1.Name = totals.Name 
AND Year BETWEEN 2000 AND 2001 
GROUP BY Name; 

Lưu ý rằng truy vấn phụ không có mệnh đề WHERE lọc năm.

+0

Dễ hiểu nhất và làm việc như một sự quyến rũ. Cảm ơn bạn rất nhiều! – John

3

Nếu bạn muốn SELECT dựa trên giá trị của SELECT khác, sau đó bạn có thể muốn có một "subselect":

http://beginner-sql-tutorial.com/sql-subquery.htm

Ví dụ, (từ liên kết ở trên):

  1. Bạn muốn tên và họ từ bảng "student_details" ...

  2. Nhưng bạn chỉ muốn thông tin này cho những học sinh trong lớp "khoa học":

    SELECT id, first_name 
    FROM student_details 
    WHERE first_name IN (SELECT first_name 
    FROM student_details 
    WHERE subject= 'Science'); 
    

Thẳng thắn mà nói, tôi không chắc chắn đây là những gì bạn đang tìm kiếm hay không ... nhưng tôi hy vọng nó giúp ... ít nhất một chút ...

IMHO ...

+0

Mẫu không hữu ích chút nào, miễn là truy vấn phụ không có ý nghĩa ở đó – zerkms

+0

Tôi có quá nhiều thứ, nhưng tôi không thể tìm ra cú pháp. Tôi đang cố gắng bao gồm một giá trị từ một bảng bên trong dựa trên giá trị từ bảng bên ngoài. – John

+0

Đề xuất sách: http://www.amazon.com/SQL-Queries-Mere-Mortals-Manipulation/dp/0321444434 Cá nhân tôi thấy nó rất hữu ích. Tôi thành thật nghĩ rằng bạn có thể thích nó, quá. IMHO ... – paulsm4

2
SELECT x.name, x.summary, (x.summary/COUNT(*)) as percents_of_total 
FROM tbl t 
INNER JOIN 
(SELECT name, SUM(value) as summary 
FROM tbl 
WHERE year BETWEEN 2000 AND 2001 
GROUP BY name) x ON x.name = t.name 
GROUP BY x.name, x.summary 
+0

X đến từ đâu? – John

+0

@ John: nó chỉ là bí danh cho truy vấn lồng nhau – zerkms

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