2012-07-09 42 views
27

Tôi muốn chọn các phím riêng biệt với số lượng điều xảy ra, truy vấn này dường như chuyển hành:SQL COUNT địa chỉ * GROUP BY lớn hơn,

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
ORDER BY count(*) desc; 

Nhưng tôi cũng muốn để lọc kết quả này, có nghĩa là tôi muốn duy nhất mà đếm (*) lớn hơn 2500 vì vậy chỉ lớn hơn 2500 lần xuất hiện sẽ được hiển thị, nhưng:

SELECT * 
FROM 
(
    SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
    FROM ItemMetaData 
    GROUP BY ItemMetaData.KEY 
    ORDER BY count(*) desc 
) as result WHERE count(*)>2500; 

Thật không may, truy vấn này dẫn đến lỗi cú pháp. Bạn có thể giúp tôi đạt được yêu cầu của tôi không?

+0

Ai đó chỉ cần xóa các bài tôi muốn chấp nhận, xin vui lòng viết nó trở lại và tôi sẽ chấp nhận nó "SELECT * TỪ ( CHỌN ItemMetaData.KEY, ItemMetaData.VALUE, count (*) 'ItemsCount' FROM ItemMetaData GROUP BY ItemMetaData.KEY ) sub WHERE sub.ItemsCount> 2500 ORDER BY sub.ItemsCount desc; " Có cũng làm việc và tự nhiên tất cả các câu trả lời khác sẽ bỏ phiếu, cảm ơn bạn, nhưng ... – czupe

Trả lời

52

HAVING khoản cho uẩn

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
Group By ItemMetaData.KEY, ItemMetaData.VALUE 
HAVING count(*) > 2500 
ORDER BY count(*) desc; 
8

Bạn nên sử dụng having với các chức năng nhóm thay vì where. Ví dụ .:

select ..., count(*) from ... group by ... having count(*) > 2500; 
6

Bạn không cần phải sử dụng một subquery - chỉ cần sử dụng một having clause thay vì where khoản để lọc theo một cột tổng hợp.

SELECT 
ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
HAVING count(*) > 2500 
ORDER BY count(*) desc 
0

Dưới đây là giải thích: WHERE khoản giới thiệu điều kiện trên các hàng riêng lẻ; Mệnh đề HAVING giới thiệu một điều kiện về tập hợp.

Sử dụng WHERE trước GROUP BYHAVING sau GROUP BY. Nó không phải là bắt buộc, nhưng có ích trong hầu hết các trường hợp.

SELECT 
     ItemMetaData.KEY, ItemMetaData.VALUE, СOUNT(*) 
FROM ItemMetaData 
GROUP BY 
     ItemMetaData.KEY, ItemMetaData.VALUE 
HAVING СOUNT(*) > 2500 
ORDER BY СOUNT(*) DESC;