Невозможно использовать агрегат или подзапрос в выражении, используемом для группы по списку предложения GROUP BY - PullRequest
7 голосов
/ 26 марта 2012

В приведенной ниже инструкции sql я получаю следующую ошибку

Невозможно использовать агрегат или подзапрос в выражении, используемом для группы по списку предложения GROUP BY.

Как я могу обойти это?

SELECT
    T.Post,
    COUNT(*) AS ClientCount,
    Client = CASE COUNT(*) WHEN '1' THEN T.Client ELSE '[Clients]' END
FROM
    MyTable T
GROUP BY
    T.Post,
    CASE COUNT(*) WHEN '1' THEN T.Client ELSE '[Clients]' END

Ответы [ 2 ]

11 голосов
/ 26 марта 2012

Если вы не включите T.Client в свой GROUP BY, вы можете включить это поле только в функцию агрегирования.В вашем случае, группировка по этому полю меняет логику, так что это не так (и связано с вашей попыткой группировки с помощью оператора CASE).Вместо этого, оберните T.Client в агрегатную функцию.

Таким образом, ваши группы остаются прежними, и когда в соответствии с тестом вашего оператора CASE есть только одна строка, вы знаете, к какому результату идет агрегатная функциядать.

SELECT
  T.Post,
  ClientCount = COUNT(*) AS ClientCount,
  Client      = CASE COUNT(*) WHEN 1 THEN MAX(T.Client) ELSE '[Clients]' END
FROM
  MyTable T
GROUP BY
  T.Post
2 голосов
/ 26 марта 2012

Вам не нужно группировать по этому выражению CASE.

SELECT
    T.Post,
    COUNT(*) AS ClientCount,
    CASE COUNT(*) WHEN '1' THEN MIN(T.Client) ELSE '[Clients]' END Client
FROM
    MyTable T
GROUP BY
    T.Post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...