2012-02-28 54 views
2

我正在使用SQL Server 2005,並發現HAVING子句的奇怪行爲。有關HAVING子句行爲的神話

根據定義,HAVING子句應該對後已分組數據工作。但是在HAVING子句中使用COUNT函數實際上在對數據進行分組之前應用於數據。

我在這裏失蹤?

的樣本數據:

DECLARE @ProductTypeIDsTable TABLE 
(
    A INT 
) 

INSERT INTO @ProductTypeIDsTable(A) VALUES 
(10),(12),(12),(9),(9),(9) 

DECLARE @IDsTable TABLE 
(
    B INT 
) 

INSERT INTO @IDsTable(B) VALUES 
(9),(10),(12) 

有問題的查詢:

SELECT A 
    FROM @ProductTypeIDsTable pt 
    INNER JOIN @IDsTable ids ON pt.A = ids.B 
    GROUP BY A 
    --HAVING COUNT (A) = 1 -- gives 10 (repeated once due to the join) 
    --HAVING COUNT (A) = 2 -- gives 12 (repeated twice due to the join) 
    HAVING COUNT (A) = 3 -- gives 9 (repeated thrice due to the join) 
+0

我不明白你說的是什麼。我得到了一行'9'的值。試試這裏。 http://data.stackexchange.com/stackoverflow/query/62661/group-by-having或者我**可以**和你一樣,我只是不明白你的問題。 – 2012-02-28 12:00:28

+0

@Mikael我認爲*提問者表示由於每個*組只有一個'A',每個組的COUNT(A)應該總是1;因此'2'和'3'行應該沒有記錄。 – AakashM 2012-02-28 12:02:25

+0

'count'是一個聚合函數,用於統計一個組的事件。在這種情況下,對於值「9」使用「3」,如果您在字段列表或having子句中使用它,則值相同。 'having'在**'group by'之後過濾行**,但是當您在having子句中執行count時,它正在計算聚合行。 – 2012-02-28 12:05:41

回答

5

使用聚合函數count不會給你不一樣的結果,如果您在字段列表或having子句中使用它。

定期組通過對A

select pt.A, count(*) as C 
from @ProductTypeIDsTable pt 
    inner join @IDsTable as ids 
    on pt.A = ids.B 
group by pt.A 

結果:

A   C 
----------- ----------- 
9   3 
10   1 
12   2 

如果您在having子句中使用count這個值是您要比較什麼。

如果您有興趣group by後返回的行數,您可以把您的查詢的子查詢是這樣的:

select count(*) as C 
from 
    (
    select pt.A 
    from @ProductTypeIDsTable pt 
     inner join @IDsTable as ids 
     on pt.A = ids.B 
    group by pt.A 
) as T 

結果:

C 
----------- 
3 

更新:

HAVING (Transact-SQL)

指定組或聚合的搜索條件。

COUNT (Transact-SQL)

返回組中的項目數量。

+0

計算整個結果集的另一種方法。 http://stackoverflow.com/questions/5146978/count-number-of-records-returned-by-group-by – Costa 2012-02-28 14:19:11