2012-02-28 4 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) 

쿼리 : 당신은 필드 목록 또는 HAVING 절에서 사용하는 경우 집계 함수를 사용

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 또는 아마도 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** 당신과 똑같은 생각을하지 못합니다. –

+0

@Mikael I think * asker는 각 그룹 *이 단지 하나의 'A'를 가지고 있으므로 각 그룹의'COUNT (A) '는 항상 1이어야한다는 것을 의미합니다. 따라서'2'와'3' 행은 레코드를 반환하지 않아야합니다. – AakashM

+0

'count'는 한 그룹의 어커런스를 집계하는 집계 함수입니다. 이 경우에 with는 값 '9'에 대해 '3'이고 필드 목록이나 having 절에서이 값을 사용하면 동일합니다. 'having '은 ** group by 뒤에 ** 행을 필터링하지만 having 절에서 count를하면 집계 된 행을 계산합니다. –

답변

5

count 당신에게 다른 결과를 제공하지 않습니다 . A에 의해

정기적 그룹 :

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

결과 : 당신이 having 절에 count를 사용하는 경우

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

이 값은 당신이에 대해 비교하는 것입니다.

당신이 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