1

我有以下查询:

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)

我也是这样写的

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关键字,一切正常(除了它给了我错误的答案)。

4

1 回答 1

1

我没有您的示例数据和实际查询,因此无法确定为什么会引发 ORA-00979。但是,就您发布的查询而言,问题在于您的PIVOT表达方式,而不是其他问题。

IN (a, b, c)

这会引发错误

ORA-56901: 枢轴|非枢轴值不允许非常量表达式

这意味着在IN子句中指定的值PIVOT应该是常量(字符串文字/数字等)

如果你使用

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

它工作得很好。

查看此DEMO以查看错误消息和有效查询。

于 2019-04-18T04:22:33.973 回答