2

SELECT    STATUS, 
          AVG(COUNT(CRIME_ID)) "Avg # of Crimes per Status"
FROM      CRIMES
GROUP BY  STATUS;

当我尝试运行它时,我得到“不是按功能分组的单组”。如您所见,我已将非聚合列包含在 group by 列表中。当它从 SELECT 列表中删除时,它会运行,但我需要用它运行它。问题是什么?

4

2 回答 2

0

Oracle 实际上确实允许嵌套其早期版本中的两个聚合函数,但这样做意味着有两个聚合,第一个带有 GROUP BY 子句,但后面的一个 - 没有。
这意味着我们无法选择 GROUP BY 中的列 -
这就是错误的根源。

通过从子句中删除STATUS列,我们得到一个有效的查询:SELECT

SELECT    AVG(COUNT(CRIME_ID)) "Avg # of Crimes per Status"
FROM      CRIMES
GROUP BY  STATUS;
每个状态的平均犯罪数量
3.33333333333333333333333333333333333333

小提琴

你可以嵌套聚合函数。例如,下面的例子计算了 scott 模式中所有部门的最高薪水的平均值:

SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id;

平均(最高(工资))
`----------------
10925

此计算评估由 GROUP BY 子句 (deptno) 定义的每个组的内部聚合 (MAX(sal)),并再次聚合结果。”

Oracle9i SQL 参考第 1 版 (9.0.1)

于 2022-03-01T05:17:02.447 回答
-1

在选择组时,Oracle 不允许以这种方式嵌套两个聚合函数。子查询计数查询,然后取平均值:

SELECT AVG(cnt)
FROM
(
    SELECT STATUS, COUNT(CRIME_ID) AS cnt
    FROM CRIMES
    GROUP BY STATUS
) t;

请注意,您可以尝试:

SELECT AVG(COUNT(CRIME_ID)) OVER () AS avg
FROM CRIMES
GROUP BY STATUS
ORDER BY STATUS
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

在这里,我们AVG()将结果集中所有组用作分析函数。然后,我们将输出限制为一行。

于 2022-03-01T03:47:15.597 回答