Миф о поведении предложения HAVING - PullRequest
2 голосов
/ 28 февраля 2012

Я использую SQL Server 2005 и обнаружил странное поведение предложения HAVING.

По определению условие HAVING: предполагается, что будет работать с данными после того, как было сгруппировано.Однако использование функции COUNT внутри предложения HAVING фактически применяется к данным до их группировки.

Что мне здесь не хватает ??

Образец данных:

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)

1 Ответ

5 голосов
/ 28 февраля 2012

Использование функции агрегирования 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

Результат:

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

Если вы используете count в предложении having, это значение - то, с чем вы сравниваете.

Если вас интересует подсчетСтроки, возвращенные после 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)

Возвращает количество элементов в группе.

...