2012-12-27 149 views
59

我要計數不同的項目數列中受到了一定的條件,例如,如果表是這樣的:COUNT DISTINCT與條件

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

如果我要計算不同數標記爲「標記計數」,並在同一個表中將條目ID> 0的不同標記的數目計爲「正確標記計數」,我該怎麼辦?

我現在從兩個不同的表格中,在第二個表格中,我只選擇了entryID大於零的那些行。我認爲應該有更緊湊的方法來解決這個問題。

回答

148

你可以試試這個:

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

第一count(distinct...)容易。 第二個,看起來有點複雜,實際上和第一個一樣,除了你使用case...when條款。在case...when子句中,僅過濾正值。零點或負值應爲null,不包括在計數中。

這裏需要注意的一件事是,這可以通過讀取表格一次來完成。看起來你必須兩次或多次閱讀同一張表,實際上可以通過在大多數時間閱讀一次來完成。因此,它將以更少的I/O更快地完成任務。

+1

但是,那麼positive_tag_count也會有區別嗎? – derekhh

+0

編輯的查詢仍然不能解決問題 - 是不是現在工作在不同的entryId值而不是不同的標籤? – BrianC

+0

這是一個非常聰明的解決方案。 – Luc

1

這可能工作:

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

這也可能工作:

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 

您需要在左側ENTRYID條件聯接,而不是在where子句中以確保任何只有entryID爲0的項目才能在第一個DISTINCT中正確計數。

+1

該查詢讀取表格兩次。它可以通過只讀表一次來完成。 – ntalbs

1

試試下面的語句:

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] 

的第一場將是標籤上的第二個將是整個計數的三分之一將是正面的計數。