2012-01-11 26 views
6

Tôi không chắc chắn chính xác làm thế nào để yêu cầu này vì vậy tôi sẽ đưa ra một ví dụSQL chọn tất cả hồ sơ chỉ nếu tổng là lớn hơn 100

Tôi có một bảng lớn tương tự với một cái gì đó như thế này ...

Name Widgets TransDate Location 
Abby 2  12/1/2010 Middleton 
Abby 13  1/10/2011 Burmingham 
Bobby 10  12/12/2011 Easton 
Bobby 5  10/10/2011 Weston 
. 
. 

Và tuyên bố sql hiện tại của tôi là ...

SELECT name, widgets, TransDate, Location 
FROM MyTable 
WHERE TransDate BETWEEN 1/1/2011 and 12/31/2011 

để cho tôi một bảng như thế này ...

Name Widgets TransDate Location 
Abby 13  1/10/2011 Burmingham 
Bobby 15  12/12/2011 Easton 
Bobby 5  10/10/2011 Weston 
. 
. 

Làm cách nào để sửa đổi SQL ở trên cũng như loại bỏ các bản ghi của những người không đáp ứng hạn ngạch Widget X ... nói X = 16. Trong trường hợp này, Abby sẽ bị xóa vì tổng số tiện ích con của cô là 13 và hồ sơ của Bobby sẽ ở lại vì tổng số của anh ấy là 20.

Cảm ơn bạn trước!

+1

Họ có cần đáp ứng hạn ngạch bên trong '1/1/2011 và 12/31/2011' hoặc bất kỳ lúc nào –

+0

Tôi cần chúng trong hạn ngạch, vì vậy tôi cần phạm vi ngày ở cả hai địa điểm – user1144191

+0

Sau đó, bạn sẽ cần phải sử dụng câu trả lời của SQLMenance hoặc sửa đổi sql của Michael để bao gồm mệnh đề WHERE trong truy vấn con –

Trả lời

21

Nếu tôi hiểu yêu cầu của bạn, bạn muốn có kết quả tương tự với những gì bạn đã có, nhưng lọc cho những tên đã đáp ứng hạn ngạch. Nếu đúng, bạn có thể sử dụng truy vấn con IN() để tìm tên được nhóm với> = 100 tiện ích con.

SELET name, widgets, TransDate, Location FROM MyTable 
WHERE 
    /* IN() subquery for names meeting the quota */ 
    name IN (
    SELECT name 
    FROM tbl 
    /* If they must have met the quota only during the time window, uncomment below */ 
    /* Otherwise, omit the WHERE clause to find those who have met the quota at any time */ 
    /* WHERE TransDate BETWEEN '1/1/2011' and '12/31/2011' */ 
    GROUP BY name 
    HAVING SUM(widgets) >= 100 

) 
    AND TransDate BETWEEN '1/1/2011' and '12/31/2011' 
+0

bạn cần phải thêm 'TransDate BETWEEN 1/1/2011 và 12/31/2011' vào truy vấn phụ, nếu không bạn sẽ trả về người tổng cộng> 16 nếu họ có tiện ích con ngoài khung thời gian đó – SQLMenace

+0

@SQLMenace Nhận xét đã thêm vào hiệu ứng đó ở trên, cảm ơn. –

+0

Tuyệt vời! Cảm ơn các bạn vì đã phản ứng cực nhanh. Tôi sẽ thử điều này và cho bạn biết làm thế nào nó quay ra. Thật không may, truy vấn của tôi phức tạp hơn một chút, sau đó truy vấn đơn giản mà tôi đã đăng, vì vậy sẽ mất một chút thời gian để triển khai. – user1144191

4

cho máy chủ sql nó có thể được thực hiện như thế này

SELECT m.name, m.widgets, m.TransDate, m.Location 
FROM MyTable m 
JOIN(SELECT name, SUM(widgets) 
      FROM MyTable 
      WHERE TransDate BETWEEN '1/1/2011' and '12/31/2011' 
      GROUP BY NAME 
      HAVING SUM(widgets) >= 16) x 
ON x.NAME = m.NAME 
WHERE m.TransDate BETWEEN '1/1/2011' and '12/31/2011' 
0

Đối với SQL Server 2005 + bạn cũng có thể thử:

SELECT name, widgets, TransDate, Location 
FROM (
     SELECT name, widgets, TransDate, Location, SUM(widgets) OVER(PARTITION BY Name) Quant 
     FROM MyTable 
     WHERE TransDate BETWEEN 1/1/2011 and 12/31/2011) A 
WHERE Quant >= 16 

này được giả định rằng các hạn ngạch phải được meeted trên cùng một khung ngày.

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