Oracle COUNT (DISTINCT expr) вызывает ошибку ORA-00979 - PullRequest
1 голос
/ 18 апреля 2019

У меня следующий запрос:

SELECT
   t.f1
   , COUNT(DISTINCT t.f2) AS distinct_count
FROM
   some_table t
GROUP BY
   t.f1

, который отлично работает.Однако, если я попытаюсь сделать это, это выдаст мне ошибку ORA-00979 not a GROUP BY expression.

WITH my_aggregate_data AS
(
   SELECT
      t.f1
      , COUNT(DISTINCT t.f2) AS distinct_count
   FROM
      some_table t
   GROUP BY
      t.f1
)

SELECT
   *
FROM
   ( SELECT f1, distinct_count FROM my_aggregate_data )
PIVOT
   (
      SUM(distinct_count)
      FOR f1
      IN (a, b, c)
   )

Если я просто удалю ключевое слово DISTINCT из метода COUNT, он будет работать нормально (за исключением того, чтоэто общее число, а не отдельное число).

Это выглядит как довольно простой запрос, но мне не удалось найти кого-то еще, документирующего эту проблему (что, вероятно, означает, что я делаю что-то не так).

В документации Oracle я также не нашел ничего, что указывало бы на то, что COUNT(DISTINCT exp) будет вести себя иначе, чем COUNT(exp), кроме очевидного различия между ними.

Я также написал это такway

SELECT
   *
FROM
   (
      SELECT
         t.f1
         , COUNT(DISTINCT t.f2) AS distinct_count
      FROM
         some_table t
      GROUP BY
         t.f1
   )
PIVOT
   (
      SUM(distinct_count)
      FOR f1
      IN (a, b, c)
   )

, но это просто приводит к той же самой ошибке ORA-00979, и снова, если вы удалите ключевое слово DISTINCT, все работает (за исключением того, что это дает мне неправильный ответ).

1 Ответ

1 голос
/ 18 апреля 2019

У меня нет ваших образцов данных и фактического запроса, поэтому я не могу точно сказать, почему поднято ORA-00979. Но что касается отправленного вами запроса, проблема в вашем выражении PIVOT и больше ничего.

IN (a, b, c)

Это выдает ошибку

ORA-56901: непостоянное выражение недопустимо для pivot | unpivot Значения

, что означает, что значения, указанные в предложении IN PIVOT, должны быть константами (строковые литералы / числа и т. Д.)

Если вы используете

IN ('a', 'b', 'c') 

Отлично работает.

Посмотрите на это DEMO , чтобы увидеть и сообщение об ошибке, и рабочий запрос.

...