2012-12-27 35 views
59

tôi muốn đếm số lượng các mục riêng biệt trong một chủ đề cột vào một điều kiện nhất định, ví dụ nếu bảng là như thế này:COUNT địa chỉ DISTINCT với ĐIỀU KIỆN

tag | entryID 
----+--------- 
foo | 0 
foo | 0 
bar | 3 

Nếu tôi muốn đếm số riêng biệt thẻ là "số lượng thẻ" và đếm số lượng thẻ riêng biệt với id mục nhập> 0 là "số thẻ tích cực" trong cùng một bảng, tôi nên làm gì?

Tôi hiện đang tính từ hai bảng khác nhau trong bảng thứ hai, tôi chỉ chọn những hàng có entryID lớn hơn 0. Tôi nghĩ rằng cần có một cách nhỏ gọn hơn để giải quyết vấn đề này.

Trả lời

148

Bạn có thể thử này:

select 
    count(distinct tag) as tag_count, 
    count(distinct (case when entryId > 0 then tag end)) as positive_tag_count 
from 
    your_table_name; 

Đầu tiên count(distinct...) là dễ dàng. Thứ hai, có vẻ hơi phức tạp, thực sự giống như cái đầu tiên, ngoại trừ việc bạn sử dụng mệnh đề case...when. Trong mệnh đề case...when, bạn chỉ lọc các giá trị dương. Số không hoặc giá trị âm sẽ là null và không được tính vào số lượng.

Một điều cần lưu ý ở đây là điều này có thể được thực hiện bằng cách đọc bảng một lần. Khi có vẻ như bạn phải đọc cùng một bảng hai lần trở lên, nó có thể thực sự được thực hiện bằng cách đọc một lần, trong phần lớn thời gian. Kết quả là, nó sẽ hoàn thành nhiệm vụ nhanh hơn rất nhiều với ít I/O hơn.

+1

Nhưng sau đó thì positive_tag_count cũng sẽ khác biệt? – derekhh

+0

Truy vấn đã chỉnh sửa vẫn không giải quyết được sự cố - hiện tại, điều này có đang hoạt động trên các giá trị entryId riêng biệt thay vì các thẻ riêng biệt không? – BrianC

+0

Đây là một sollution thực sự thông minh. – Luc

1

này có thể làm việc:

SELECT Count(tag) AS 'Tag Count' 
FROM Table 
GROUP BY tag 

SELECT Count(tag) AS 'Negative Tag Count' 
FROM Table 
WHERE entryID > 0 
GROUP BY tag 
0

này cũng có thể làm việc:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag, 
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag 
FROM Table T 
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0 

Bạn cần điều kiện entryID trong trái join chứ không phải trong một mệnh đề where để đảm bảo rằng bất kỳ mục nào chỉ có một entryID 0 được tính đúng trong DISTINCT đầu tiên.

+1

Truy vấn này đọc bảng hai lần. Nó có thể được thực hiện bằng cách đọc bảng chỉ một lần. – ntalbs

1

Thử tuyên bố sau:

select distinct A.[Tag], 
    count(A.[Tag]) as TAG_COUNT, 
    (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0) 
    from [TagTbl] AS A GROUP BY A.[Tag] 

Các lĩnh vực đầu tiên sẽ là thẻ thứ hai sẽ là toàn bộ số thứ ba sẽ là những người tích cực đếm.

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