2010-07-19 43 views
38

cho rằng tôi có bảngsử dụng mysql SUM() trong một mệnh đề WHERE

id | cash 
1 200 
2 301 
3 101 
4 700 

này và tôi muốn trả lại hàng đầu tiên trong điều kiện tổng của tất cả các tiền mặt trước là lớn hơn một giá trị nhất định:

Ví dụ:

Ví dụ: nếu tôi muốn trả lại hàng đầu tiên trong đó tổng của tất cả tiền mặt trước lớn hơn 500, phải trở về hàng 3

Làm cách nào để thực hiện điều này bằng câu lệnh mysql?

sử dụng WHERE SUM(cash) > 500 không hoạt động

+1

Bạn muốn chọn 'id = 3' vì' 200 + 300> = 500' hoặc vì '501> 500'? – Dolph

+0

Bạn có bao gồm mệnh đề ORDER BY không? Bạn không thể thực sự nói được bản ghi "tiếp theo" vì các hàng không được lưu trữ theo bất kỳ thứ tự cụ thể nào. – Robot

+0

đó là vì 200 + 301> = 500 ... yea tôi đã thử đơn hàng và có điều khoản nhưng trong trường hợp này họ sẽ trả về hàng 4 vì hàng 4 là> = 500, không phải hàng 3 như dự định –

Trả lời

76

Bạn chỉ có thể sử dụng cốt liệu để so sánh trong mệnh đề HAVING:

GROUP BY ... 
    HAVING SUM(cash) > 500 

Mệnh HAVING đòi hỏi bạn phải xác định một mệnh đề GROUP BY.

Để có được hàng đầu tiên mà tổng của tất cả các tiền mặt trước là lớn hơn một giá trị nhất định, sử dụng:

SELECT y.id, y.cash 
    FROM (SELECT t.id, 
       t.cash, 
       (SELECT SUM(x.cash) 
        FROM TABLE x 
       WHERE x.id <= t.id) AS running_total 
     FROM TABLE t 
    ORDER BY t.id) y 
WHERE y.running_total > 500 
ORDER BY y.id 
    LIMIT 1 

Bởi vì hàm tổng hợp xảy ra trong một subquery, bí danh cột cho nó có thể được tham chiếu trong mệnh đề WHERE.

+0

Tôi nghĩ chỉnh sửa của ông làm rõ những gì ông có nghĩa là và thực hiện điều này không còn đúng –

+0

@ Michael Mrozek: Thx cho người đứng đầu lên, nghĩ rằng tôi đã nhận nó. –

+0

hi đó, cảm ơn vì sự giúp đỡ Tôi đang tự hỏi về việc có hay không mã này sẽ hoạt động tốt trên bảng lớn mặc dù Bất kỳ ý kiến ​​về các chi phí hoạt động của việc sử dụng phương pháp này trên một cơ sở dữ liệu lớn? –

0

Khi sử dụng chức năng tổng hợp để lọc, bạn phải sử dụng câu lệnh HAVING.

SELECT * 
FROM tblMoney 
HAVING Sum(CASH) > 500 
5

Không kiểm tra, nhưng tôi nghĩ điều này sẽ đóng?

SELECT m1.id 
FROM mytable m1 
INNER JOIN mytable m2 ON m1.id < m2.id 
GROUP BY m1.id 
HAVING SUM(m1.cash) > 500 
ORDER BY m1.id 
LIMIT 1,2 

Ý tưởng là để tổng hợp tất cả các hàng trước, chỉ nhận được những cái mà tổng của các hàng trước là> 500, sau đó bỏ qua một và trả lại kế tiếp.

+0

Điều này không hoạt động khi nó trả về 2. Sử dụng 'SELECT m2.id' thay vì' SELECT m1.id' trả về 3 - kết quả mong đợi. Nhưng nếu 'id' không theo thứ tự. Nên sử dụng 'ORDER BY m2.id' thay vì' ORDER BY m1.id' là giải pháp? Nhưng mệnh đề 'ORDER BY' làm cho thứ tự trong khi hiển thị đầu ra, đúng không? Vì vậy, bạn có thể giải thích làm thế nào 'id' có thể được sắp xếp theo thứ tự 'ASC' khi quan hệ' JOIN' hoạt động thay vì khi kết quả được trình bày? –

3

Nói chung, điều kiện trong mệnh đề WHERE của truy vấn SQL có thể chỉ tham chiếu một hàng. Ngữ cảnh của mệnh đề WHERE được đánh giá trước khi bất kỳ thứ tự nào đã được xác định theo mệnh đề ORDER BY và không có thứ tự ngầm định cho bảng RDBMS.

Bạn có thể sử dụng bảng dẫn xuất để nối mỗi hàng vào nhóm hàng có giá trị id nhỏ hơn và tạo tổng của mỗi nhóm tổng. Sau đó kiểm tra nơi tổng hợp đáp ứng tiêu chí của bạn.

CREATE TABLE MyTable (id INT PRIMARY KEY, cash INT); 

INSERT INTO MyTable (id, cash) VALUES 
    (1, 200), (2, 301), (3, 101), (4, 700); 

SELECT s.* 
FROM (
    SELECT t.id, SUM(prev.cash) AS cash_sum 
    FROM MyTable t JOIN MyTable prev ON (t.id > prev.id) 
    GROUP BY t.id) AS s 
WHERE s.cash_sum >= 500 
ORDER BY s.id 
LIMIT 1; 

Output:

+----+----------+ 
| id | cash_sum | 
+----+----------+ 
| 3 |  501 | 
+----+----------+ 
+0

hiển thị lỗi: '# 1052 - Cột' tiền mặt 'trong danh sách trường không rõ ràng' –

+0

@IstiaqueAhmed, cảm ơn vì đã bắt được điều đó. Tôi đã thêm một tên tương quan vì vậy bây giờ nó là 'SUM (prev.cash)'. Điều đó sẽ khắc phục lỗi. –

+0

Và bây giờ nó hiển thị 'id' là 2 thay vì 3 và' cash_sum' 501.00. –

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