我正在使用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)
我不明白你說的是什麼。我得到了一行'9'的值。試試這裏。 http://data.stackexchange.com/stackoverflow/query/62661/group-by-having或者我**可以**和你一樣,我只是不明白你的問題。 – 2012-02-28 12:00:28
@Mikael我認爲*提問者表示由於每個*組只有一個'A',每個組的COUNT(A)應該總是1;因此'2'和'3'行應該沒有記錄。 – AakashM 2012-02-28 12:02:25
'count'是一個聚合函數,用於統計一個組的事件。在這種情況下,對於值「9」使用「3」,如果您在字段列表或having子句中使用它,則值相同。 'having'在**'group by'之後過濾行**,但是當您在having子句中執行count時,它正在計算聚合行。 – 2012-02-28 12:05:41